UITableViewCell的属性在将UITableView实例化为popover时为零
我有一个UISegmentedControl
从UISegmentedControl
我想提出一个UITableViewController
作为popup窗口,当我点击一个segmentedControl
段。 我遇到的问题是我点击一个段的时候,popover开始加载,但是当myPopoverTableViewController加载时崩溃。 它崩溃了
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
,说我的PopoverTableViewCell
的属性是nil
。
为了简单起见,我会在这里引用我的课程:
myViewController: MyViewController myPopoverTVController: PopoverTableViewController myPopoverTVCell: PopoverTableViewCell
在lldb
,我检查了cell和dataSource
的值,看来唯一没有myPopoverTVCell
的属性,我在myPopoverTVController's viewWillAppear
中用下面一行注册:
tableView.register(PopoverTableViewCell.self, forCellReuseIdentifier: "cell")
myPopoverTVController
没有通过myPopoverTVController
连接(尽pipe我试过) myViewController
。 我已经检查过,我在类myPopoverTVController's
原型单元格中引用了myPopoverTVController's
。 我已经检查了单元格到PopoverTableViewCell
类的连接。 我检查了我已经将表格视图单元格的标识符设置为故事板上的cell
。
下面是我如何从myViewController
开始,遵循苹果的代码 :
@IBAction func segmentedControlAction(_ sender: UISegmentedControl) { // instantiate the PopoverTableViewController let popoverTVC = PopoverTableViewController() // set variables on it popoverTVC.selectedSegmentIndex = sender.selectedSegmentIndex popoverTVC.currentRegion = currentRegion // disignate presentation style as a popover popoverTVC.modalPresentationStyle = .popover present(popoverTVC, animated: true, completion: nil) let presentationController = UIPopoverPresentationController(presentedViewController: popoverTVC, presenting: self) presentationController.permittedArrowDirections = .up presentationController.sourceView = view presentationController.sourceRect = segmentedControl.frame }
在myPopoverTVController
,这是我的cellForRowAt indexPath
样子:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PopoverTableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PopoverTableViewCell // Configure the cell... switch selectedSegmentIndex { case 0, 1: cell.areaLabel.text = popoverStringArray[indexPath.row] case 2: let countryList = locationManager.countryList let countryCodes = locationManager.countryCodes cell.areaLabel?.text = countryList[indexPath.row] cell.flagLabel?.text = countryCodes[indexPath.row] default: break } return cell }
我检查了在myViewController
上实例化设置的variables,他们都得到了值。 这只是tableViewCell
属性是nil
– lldb
返回单元格的内存地址,当我键入po cell
。 我已经设置了一百万次UITableViews
,但我无法弄清楚这个问题。 任何build议重新:我做错了什么,非常感谢。 我放心,我的问题是我的一个惊人的愚蠢的遗漏。 感谢您的阅读。
我尝试着使用苹果的代码,想出了一个可以让popover工作的替代方法。
我ctrl+dragged
从我的myViewController
故事板ctrl+dragged
myPopoverTVController
。 我将segue标识符设置为popoverSegue
,并将其设置为popup窗口。 我也指定了一个定位点。
从那里,我烧毁了segmentedControlAction()
的代码,将其replace为以下代码:
@IBAction func segmentedControlAction(_ sender: UISegmentedControl) { self.performSegue(withIdentifier: "popoverSegue", sender: segmentedControl.selectedSegmentIndex) }
我在myViewController
prepareForSegue
添加了下面的代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "popoverSegue" { let destinationViewController = segue.destination as! PopoverTableViewController destinationViewController.selectedSegmentIndex = sender as! Int destinationViewController.currentRegion = currentRegion let popoverController = destinationViewController.popoverPresentationController if popoverController != nil { popoverController?.delegate = self } } }
我还用一个扩展名向myViewController
添加了一个委托方法:
extension MyViewController: UIPopoverPresentationControllerDelegate { func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { return .none } }
最后,我在myPopoverTVController
取出了对数据源的本地引用,现在看起来像这样:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! PopoverTableViewCell // Configure the cell... switch selectedSegmentIndex { case 0: cell.areaLabel.text = locationManager.cityList(geographicRegion: currentRegion!)[indexPath.row] cell.flagLabel.isHidden = true case 1: cell.areaLabel.text = locationManager.stateList(geographicRegion: currentRegion!)[indexPath.row] cell.flagLabel.isHidden = true case 2: cell.areaLabel?.text = locationManager.countryList[indexPath.row] cell.flagLabel?.text = locationManager.countryCodes[indexPath.row].flag() default: break } return cell }
…它的工作。
结束 ;)