我有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}}一百万次,但我无法解决这个问题。任何建议:非常感谢我做错了什么。我会放心,我的问题对我来说是一个令人吃惊的愚蠢遗漏。谢谢你的阅读。
答案 0 :(得分:0)
我试图使用Apple的代码,并想出了另一种让popover工作的方法。
我ctrl+dragged
到myViewController
的故事板中的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
}
......它有效。
结束;)