【问题标题】:Why do I get a runtime error with using tableView.dequeueReusableCellWithIdentifier为什么使用 tableView.dequeueReusableCellWithIdentifier 会出现运行时错误
【发布时间】:2015-06-20 19:18:11
【问题描述】:

我正在学习 Swift 中的基本表格视图,并在尝试使用 tableView.dequeueResuableCellWithIdentifier 时遇到了问题。

每次调用此方法时,我都会创建一个新的 UITableViewCell(例如 var cell = UITableViewCell() ),但我知道这是非常低效的,不是最佳实践。现在,使用我在下面粘贴的代码,我在 'var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! 处收到运行时错误! UITableViewCell'。

我已经指定了一个 Prototype 单元,并给它一个重用标识符“单元”。

class ViewController: UIViewController, UITableViewDataSource {

let devCourses = [
    ("iOS App Dev with Swift Essential Training","Simon Allardice"),
    ("iOS 8 SDK New Features","Lee Brimelow"),
    ("Data Visualization with D3.js","Ray Villalobos"),
    ("Swift Essential Training","Simon Allardice"),
    ("Up and Running with AngularJS","Ray Villalobos"),
    ("MySQL Essential Training","Bill Weinman"),
    ("Building Adaptive Android Apps with Fragments","David Gassner"),
    ("Advanced Unity 3D Game Programming","Michael House"),
    ("Up and Running with Ubuntu Desktop Linux","Scott Simpson"),
    ("Up and Running with C","Dan Gookin") ]

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return devCourses.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell

    let (courseTitle, courseAuthor) = devCourses[indexPath.row]

    cell.textLabel?.text = courseTitle
    return cell
}

我得到的唯一输出是 (lldb),所以我不知道问题出在哪里。我正在使用 Xcode 6.3.2。

谢谢!

【问题讨论】:

  • 你在哪里注册表格视图的单元格标识符?
  • 从情节提要中,我在表格视图中选择了原型单元格,然后在属性检查器中的标识符字段中输入了“单元格”。
  • 您说您在特定行中有运行时错误,但您唯一的输出是 lldb。你确定你没有在该行设置断点吗?
  • 我很尴尬地承认这一点,但这就是我所做的 Emilio。我不是故意的,所以我一定是不小心做了。谢谢!!

标签: ios swift uitableview


【解决方案1】:

如果您使用的是标准单元,看起来就像是这样,您仍然需要将该类注册为要出列的单元类。现在,您是 tableView 不知道要出列什么类型。

viewDidLoad这个方法中,你应该做这样的事情:

self.tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "cell")

这样,表格视图将正确地将该表格的标识符为"cell" 的单元格出列。

【讨论】:

    【解决方案2】:

    如果您想确保 Storyboards 中的其他内容不会覆盖注册,请尝试以下操作:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Make sure that "cell" is the name of the reuse identifier. Maybe use a const in M file to set it.
        let nibName = UINib(nibName: "YourNibName", bundle:nil)
        self.tableView.registerNib(nibName, forCellReuseIdentifier: "cell")
    }
    

    由于viewDidLoad 发生在笔尖加载之后,这将确保无论是什么导致了问题,你都会得到最后的决定——除非它在你的代码中的其他地方。

    struct UIConstants {
        struct SomeViewControllerUIConstants {
            static let cellNibName          = "SpecialCell";
            static let cellReuseIdentifier  = "cell";
        }
    }
    

    另外,也许考虑声明一个伪const struct 如上所述。这将减少导致这种运行时异常的拼写或大写问题的可能性,顺便说一下,我认为 Apple 不妨花几个小时进行编程以更优雅地处理。为什么不进行不区分大小写的搜索,或者不区分字符串距离大小写,以查看它是否可以在 01 的距离内找到一个匹配项?反正我跑题了。

    【讨论】:

      【解决方案3】:

      我可以使您的代码无需更改即可工作。关键在于故事板的正确设置。

      1. 确保您的 Storyboard 中的 ViewController 的类在 Identity Inspector 中设置为 ViewController。注意,不是UIViewController

      2. 确保已设置 tableView 数据源。您可以 control 从 Storyboard 中的 tableView 拖动到顶部的 ViewController 图标,然后从弹出窗口中选择 dataSource

      3. 确保原型单元格的重用标识符设置为“单元格”。

      【讨论】:

        【解决方案4】:

        谢谢大家的回答。事实证明我做了一些愚蠢的事情——我不小心在那行添加了一个断点。 EmilioPelaez 认为这可能是问题所在,而且确实如此。代码现在按预期工作。

        再次感谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多