无法从具有自定义单元格的dataSource获取单元格

时间:2017-01-04 19:39:12

标签: swift uitableview

更新:道歉,有一个复制/粘贴问题 - 代码现在显示为存在 - 包含所有返回...

一般来说,我可以用所有伟大的现有例子来解决这个问题。很高兴您可能需要更新任何其他信息。

目标:
创建一个包含2个部分的UITableViewController。在上半部分,我想显示一个自定义分类行,它提供基于开关的设置。在下半部分,我想提供一个要选择的项目列表 - 再次使用自定义类。

所有单元格和链接都是在故事板中创建的

问题:
它编译得很好,但在运行时它失败了:

  

由于未捕获的异常终止应用' NSInternalInconsistencyException',原因:' UITableView(; layer =; contentOffset:{0,-64}; contentSize:{375,88}>)失败从dataSource()'中获取一个单元格   第一次抛出调用堆栈:

我尝试过:

  1. 使用断点,我看过它通过numberOfSections和numberOfRowsInSection滚动。
  2. 我尝试使用断点检查cellForRowAtIndexPath中的单元格,但在调用函数之前抛出异常。
  3. 破碎,重新连接链接,检查标识符,重新验证我知道要做的所有事情。
  4. 课程和截屏如下:

    带开关的单元的类

    CellWithSwitch

    import UIKit
    
    class CellWithSwitchTableViewCell: UITableViewCell {    
        @IBOutlet weak var nameLabel: UILabel!
        @IBOutlet weak var nameSwitch: UISwitch!
    
        override func awakeFromNib() {
            super.awakeFromNib()
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
        }
    
    }
    

    具有选择

    的单元格的类

    CellWithSelect

    import UIKit
    
    class CellWithSelectTableViewCell: UITableViewCell {
    
        @IBOutlet weak var nameLabel: UILabel!
    
        override func awakeFromNib() {
            super.awakeFromNib()
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
    
        }
    }
    

    TableViewController:

    class MapOptionsTableViewController: UITableViewController {
        var mapOptions = MapOptionsAvailable()
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            // return the number of sections
            return 2
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            var returnValue = Int()
    
            if section == 1 {
                returnValue = 1  
    
            } else if section == 0 {
    
                returnValue =  1 
            }
            return returnValue
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            print("Entered cellforRowAtIndexPath.  Row",indexPath.row,"Section",indexPath.section)
    
            if indexPath.section == 0 {
                let cell = tableView.dequeueReusableCell(withIdentifier: "CellWithSwitch", for: indexPath as IndexPath) as! CellWithSwitchTableViewCell
                cell.nameLabel.text = "Name of switch"
                cell.nameSwitch.setOn(true, animated: true)
    
                return cell
    
            } else {
                let cell = tableView.dequeueReusableCell(withIdentifier: "CellWithSelect", for: indexPath as IndexPath) as! CellWithSelectTableViewCell
                cell.nameLabel.text = "Name of Selection"
    
                return cell
    
    
            }
        }
    }
    

    如果我能提供任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

之前应该看过这个。

更改旧语法:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

新语法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

瞧!! ​​