当我尝试使用tableView.dequeueResuableCellWithIdentifier时,我正在学习Swift中的基本表视图并遇到问题。
每次调用此方法时,我都会通过创建一个新的UITableViewCell来工作(例如var cell = UITableViewCell()),但我知道效率非常低,而不是最佳实践。现在,通过下面粘贴的代码,我得到了一个运行时错误,在< varView = tableView.dequeueReusableCellWithIdentifier(" cell",forIndexPath:indexPath)为!的UITableViewCell'
我已经指定了一个Prototype单元格,并为其指定了重复标识符' cell'。
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。
谢谢!
答案 0 :(得分:0)
如果您使用的是标准单元格,您似乎仍然需要将该类注册为要出列的单元格类。现在,你tableView
不知道要出列什么类型。
在此方法的viewDidLoad
中,您应该执行以下操作:
self.tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "cell")
这样,表视图将使该表的标识符"cell"
的单元格正确出列。
答案 1 :(得分:0)
如果您想确保故事板中的其他内容不会覆盖注册,请尝试以下操作:
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")
}
由于<{1}}在之后发生 nib被加载,这将确保无论是什么导致问题,你都会得到最后一句话 - 除非你的代码在其他地方。< / p>
另外,也许可以考虑如上所述声明伪viewDidLoad
struct UIConstants {
struct SomeViewControllerUIConstants {
static let cellNibName = "SpecialCell";
static let cellReuseIdentifier = "cell";
}
}
const
。这将减少拼写或大写问题造成这种运行时异常的可能性,顺便说一句,我认为Apple可能花费几个小时来编程以更优雅地处理。为什么不对不区分大小写的搜索或字符串距离不区分大小写,以确定它是否可以找到距离struct
或0
之外的一个匹配项?无论如何,我离题了。
答案 2 :(得分:0)
我能够使您的代码无需更改即可运行。关键在于故事板的正确设置。
确保故事板中ViewController的类在 Identity Inspector 中设置为ViewController
。请注意,不是UIViewController
。
确保已设置tableView dataSource。您可以从故事板中的tableView control -drag到顶部的ViewController
图标,然后从弹出窗口中选择 dataSource 。
确保原型单元格的重用标识符设置为&#34; cell&#34;。
答案 3 :(得分:0)
谢谢大家的回答。事实证明我做了一些愚蠢的事 - 我不小心在那条线上添加了一个断点。 EmilioPelaez认为这可能是问题,而且确实存在问题。代码现在按预期工作。
再次感谢!