2016-09-15 45 views
0

无法在TableViewCell.Data事件报告中显示数据,但是当您打开数组“sports”时显示的数据不会显示在标题中。传递结束......JSON中的值不会在tableviewcell自定义中显示

这是我的JSON代码...

Event.swift 


    import UIKit 

    struct Event { 
     let match : String 
     let forecast : String 
     let data : String 
     let image : UIImage 
     var sports : [Sport] 

     init (match : String, forecast : String, data: String, image : UIImage, sports : [Sport]) { 

     self.match = match 
     self.forecast = forecast 
     self.data = data 
     self.image = image 
     self.sports = sports 


     } 

     static func eventsFromBundle()-> [Event] { 

      var events = [Event]() 


      guard let url = Bundle.main.url(forResource: "events", withExtension: "json") else { 
       return events 
      } 
       do { 
        let data = try Data(contentsOf: url) 
        guard let rootObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : Any] else { 

         return events 
        } 

        guard let eventObjects = rootObject["events"] as? [[String: AnyObject]] else { 
         return events 
        } 
        for eventObject in eventObjects { 
         if let match = eventObject["match"] as? String, 
          let forecast = eventObject["forecast"] as? String, 
          let data = eventObject["data"] as? String, 
          let imageName = eventObject["image"] as? String, 
          let image = UIImage(named: imageName), 
          let sportsObject = eventObject["sports"] as? [[String : String]]{ 
          var sports = [Sport]() 
          for sportObject in sportsObject { 
           if let nameTitle = sportObject["name"] , 
            let titleName = sportObject["image"], 
            let titleImage = UIImage(named: titleName + ".jpg"), 
            let prognozLabel = sportObject["prognoz"], 
            let obzor = sportObject["obzor"] { 
           sports.append(Sport(name: nameTitle, prognoz: prognozLabel, image: titleImage, obzor: obzor, isExpanded: false)) 

           } 
          } 

          let event = Event(match: match, forecast: forecast, data: data, image: image, sports: sports) 
          events.append(event) 

         } 
        } 


       } catch { 
        return events 
      } 

      return events 
     } 

    } 

import UIKit 

class SportViewController: BaseViewController { 

    var events = Event.eventsFromBundle() 


    @IBOutlet weak var tableView: UITableView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     addSlideMenuButton() 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 100 


    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     NotificationCenter.default.addObserver(forName: .UIContentSizeCategoryDidChange, object: .none, queue: OperationQueue.main) { [weak self] _ in 
      self?.tableView.reloadData() 

     } 
    } 


     override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destination = segue.destination as? SportDetailViewController, 
      let indexPath = tableView.indexPathForSelectedRow { 
      destination.selectedEvent = events[indexPath.row] 
     } 
    } 
} 



extension SportViewController: UITableViewDataSource { 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return events.count 
} 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellMatch", for: indexPath) as! SportTableViewCell 

    let event = events[indexPath.row] 
    cell.matchLabel.text = event.match 
    cell.imageMatch.image = event.image 
    cell.forecastLabel.text = event.forecast 
    cell.dataLabel.text = event.data 

    cell.matchLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) 
    cell.forecastLabel.font = UIFont.preferredFont(forTextStyle: .callout) 
    return cell 

    } 
} 

她是controller.SportDetailViewController.swift

import UIKit 

class SportDetailViewController: UIViewController { 

    var selectedEvent : Event! 



    let obzorText = "Select for more info >" 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     title = selectedEvent.match 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 300 



     // Do any additional setup after loading the view. 
      } 
     override func viewDidAppear(_ animated: Bool) { 
      super.viewDidAppear(animated) 


      } 

    } 



extension SportDetailViewController: UITableViewDataSource { 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return selectedEvent.sports.count 

    } 



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
      let cell : SportDetailTableViewCell = tableView.dequeueReusableCell(withIdentifier: "cellMatch", for: indexPath) as! SportDetailTableViewCell 

      let sport = selectedEvent.sports[indexPath.row] 


      cell.nameTitle.text = sport.name 
      cell.titleImage.image = sport.image 
      cell.prognozLabel.text = sport.prognoz 
      cell.selectionStyle = .none 
      cell.nameTitle.backgroundColor = UIColor.darkGray 
      cell.backgroundColor = UIColor.red 

      cell.obzorText.text = sport.isExpanded ? sport.obzor : obzorText 
      cell.obzorText.textAlignment = sport.isExpanded ? .left : .center 

      return cell 
} 
    } 



extension SportDetailViewController: UITableViewDelegate { 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    guard let cell = tableView.cellForRow(at: indexPath) as? SportDetailTableViewCell else { return } 

     var sport = selectedEvent.sports[indexPath.row] 

     sport.isExpanded = !sport.isExpanded 
     selectedEvent.sports[indexPath.row] = sport 

     cell.obzorText.text = sport.isExpanded ? sport.obzor : obzorText 
     cell.obzorText.textAlignment = sport.isExpanded ? .left : .center 


     tableView.beginUpdates() 
     tableView.endUpdates() 

     tableView.scrollToRow(at: indexPath, at: .top, animated: true) 

    } 

} 

所有这些方法都试过:tableview.datasourc e = self,tableview.delegate = self和reloadData()..... in viewDidLoad。

+0

Yes.Why我做错了什么?我做了成为自我尺寸RayWenderlinch的教训。可以帮助纠正错误吗? – ShurikTennisist

+0

您在“SportDetailViewController”中加载了哪些事件数据? – nayem

+0

我有另一个控制器的数据事件被加载。我已经显示数据“事件”。 – ShurikTennisist

回答

0

struct删除此init:(因为struct得到免费的初始化)

init (match : String, forecast : String, data: String, image : UIImage, sports : [Sport]) { 

    self.match = match 
    self.forecast = forecast 
    self.data = data 
    self.image = image 
    self.sports = sports 
} 

现在,你var events因为你是调用类范围的方法将不会被填充。因此,改变这种:

class SportViewController: BaseViewController { 

    var events = Event.eventsFromBundle() 
    ... 
    ... 
} 

class SportViewController: BaseViewController { 

    var events = [Event]() 
    ... 
    ... 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     addSlideMenuButton() 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 100 

     events = Event().eventsFromBundle() 
    } 
    ... 
    ... 
} 

这应该解决您的问题。

+0

请参阅我的编辑并从这里删除'static':'static func eventsFromBundle()' – nayem

+0

只删除'static'关键字,而不是整行。 – nayem

+0

@ShurikTennisist现在尝试编辑代码。 – nayem