在将UITableView实例化为弹出窗口时,UITableViewCell的属性为nil

时间:2016-12-01 19:16:38

标签: ios swift uitableview uipopovercontroller

我有UIViewController UISegmentedControl,当我点击UITableViewController段时,我希望将segmentedControl作为弹出窗口。我遇到的问题是,当我点击一个片段时,popover开始加载,但是当myPopoverTableViewController加载时崩溃。它崩溃了

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell,说我PopoverTableViewCell的属性为nil

为了简单起见,我将在这里引用我的课程:

myViewController: MyViewController
myPopoverTVController: PopoverTableViewController
myPopoverTVCell: PopoverTableViewCell

lldb中,我检查了单元格的值,dataSource,似乎唯一没有myPopoverTVCell的属性,我在myPopoverTVController's viewWillAppear注册了以下一行:

tableView.register(PopoverTableViewCell.self, forCellReuseIdentifier: "cell")

myPopoverTVController未通过popover segue(虽然我已经尝试过)连接到myViewController。我已经检查过我在PopoverTableViewCell原型单元格的类中引用了myPopoverTVController's。我已经仔细检查了从单元格到PopoverTableViewCell类的连接。我检查了故事板上我将表格视图单元格的标识符设置为cell

以下是Apple's code之后我从myViewController开始使用popover的方式:

@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上实例化时设置的变量,并且他们都获得了值。只有tableViewCell nil属性lldb - po cell才会在我输入UITableViews时返回单元格的内存地址。我已经设置了{{1}}一百万次,但我无法解决这个问题。任何建议:非常感谢我做错了什么。我会放心,我的问题对我来说是一个令人吃惊的愚蠢遗漏。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

我试图使用Apple的代码,并想出了另一种让popover工作的方法。

ctrl+draggedmyViewController的故事板中的myPopoverTVController。我将 segue标识符设置为popoverSegue并将其设置为显示为弹出窗口。我还指定了一个锚点。

从那里开始,我在segmentedControlAction()中删除了代码,用以下代码替换它:

@IBAction func segmentedControlAction(_ sender: UISegmentedControl) {

    self.performSegue(withIdentifier: "popoverSegue", sender: segmentedControl.selectedSegmentIndex)

}

我在prepareForSegue上的myViewController添加了以下代码:

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
}

......它有效。

结束;)