UITableViewCell的属性在将UITableView实例化为popover时为零

我有一个UISegmentedControlUISegmentedControl我想提出一个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属性是nillldb返回单元格的内存地址,当我键入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 } 

…它的工作。

结束 ;)