将 UITableView 实例化为弹出窗口时,UITableViewCell 的属性为 nil
UITableViewCell's attributes are nil when instantiating UITableView as a popover
我有一个 UIViewController
和一个 UISegmentedControl
,当我点击 segmentedControl
部分时,我想从中显示一个 UITableViewController
作为弹出窗口。我遇到的问题是当我点击一个片段时,弹出窗口开始加载,但随着 myPopoverTableViewController 加载而崩溃。它在
中崩溃
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
,说我PopoverTableViewCell
的属性是nil
.
为简单起见,我将在此处引用我的 class:
myViewController: MyViewController
myPopoverTVController: PopoverTableViewController
myPopoverTVCell: PopoverTableViewCell
在 lldb
中,我检查了单元格 dataSource
的值,似乎唯一没有的是 myPopoverTVCell
的属性,我注册了在 myPopoverTVController's viewWillAppear
中包含以下行:
tableView.register(PopoverTableViewCell.self, forCellReuseIdentifier: "cell")
myPopoverTVController
没有通过弹出窗口连接(虽然我试过了)到 myViewController
。我检查过我在 class 中为 myPopoverTVController's
原型单元格引用了 PopoverTableViewCell
。我已经仔细检查了从单元格到 PopoverTableViewCell
class 的连接。我检查了故事板上的 Table View Cell 标识符是否设置为 cell
。
这是我从 myViewController
开始弹出窗口的方式,遵循 Apple's code:
@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
上实例化时设置的变量,它们都有值。当我键入 po cell
时,tableViewCell
属性只是 nil
--lldb
returns 单元格的内存地址。我已经设置了 UITableViews
一百万次,但我无法弄清楚这件事。非常感谢任何关于我做错了什么的建议。我会放心,我的问题是我的一个非常愚蠢的疏忽。感谢您阅读。
我放弃了尝试使用 Apple 代码的尝试,并找到了一种让弹出窗口正常工作的替代方法。
我 ctrl+dragged
在我的 myViewController
到 myPopoverTVController
的故事板中。我将 segue 标识符 设置为 popoverSegue
并将其设置为显示为弹出窗口。我还指定了一个锚点。
从那里,我删除了 segmentedControlAction()
中的代码,将其替换为以下内容:
@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
}
...成功了。
结束 ;)
我有一个 UIViewController
和一个 UISegmentedControl
,当我点击 segmentedControl
部分时,我想从中显示一个 UITableViewController
作为弹出窗口。我遇到的问题是当我点击一个片段时,弹出窗口开始加载,但随着 myPopoverTableViewController 加载而崩溃。它在
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
,说我PopoverTableViewCell
的属性是nil
.
为简单起见,我将在此处引用我的 class:
myViewController: MyViewController
myPopoverTVController: PopoverTableViewController
myPopoverTVCell: PopoverTableViewCell
在 lldb
中,我检查了单元格 dataSource
的值,似乎唯一没有的是 myPopoverTVCell
的属性,我注册了在 myPopoverTVController's viewWillAppear
中包含以下行:
tableView.register(PopoverTableViewCell.self, forCellReuseIdentifier: "cell")
myPopoverTVController
没有通过弹出窗口连接(虽然我试过了)到 myViewController
。我检查过我在 class 中为 myPopoverTVController's
原型单元格引用了 PopoverTableViewCell
。我已经仔细检查了从单元格到 PopoverTableViewCell
class 的连接。我检查了故事板上的 Table View Cell 标识符是否设置为 cell
。
这是我从 myViewController
开始弹出窗口的方式,遵循 Apple's code:
@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
上实例化时设置的变量,它们都有值。当我键入 po cell
时,tableViewCell
属性只是 nil
--lldb
returns 单元格的内存地址。我已经设置了 UITableViews
一百万次,但我无法弄清楚这件事。非常感谢任何关于我做错了什么的建议。我会放心,我的问题是我的一个非常愚蠢的疏忽。感谢您阅读。
我放弃了尝试使用 Apple 代码的尝试,并找到了一种让弹出窗口正常工作的替代方法。
我 ctrl+dragged
在我的 myViewController
到 myPopoverTVController
的故事板中。我将 segue 标识符 设置为 popoverSegue
并将其设置为显示为弹出窗口。我还指定了一个锚点。
从那里,我删除了 segmentedControlAction()
中的代码,将其替换为以下内容:
@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
}
...成功了。
结束 ;)