所以我为我的学校做了一个rss阅读器,并完成了代码。我运行了测试,它给了我这个错误。下面是它引用的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = 
     [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
                                     forIndexPath:indexPath];
    if (cell == nil) {

        cell = 
         [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle  
                                reuseIdentifier:CellIdentifier];

    }

以下是输出中的错误:

2012-10-04 20:13:05.356 Reader[4390:c07] * Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460 2012-10-04 20:13:05.357 Reader[4390:c07] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' * First throw call stack: (0x1c91012 0x10cee7e 0x1c90e78 0xb64f35 0xc7d14 0x39ff 0xd0f4b 0xd101f 0xb980b 0xca19b 0x6692d 0x10e26b0 0x228dfc0 0x228233c 0x228deaf 0x1058cd 0x4e1a6 0x4ccbf 0x4cbd9 0x4be34 0x4bc6e 0x4ca29 0x4f922 0xf9fec 0x46bc4 0x47311 0x2cf3 0x137b7 0x13da7 0x14fab 0x26315 0x2724b 0x18cf8 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x147da 0x1665c 0x2a02 0x2935) libc++abi.dylib: terminate called throwing an exception

下面是它在错误屏幕上显示的代码:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

请帮助!


当前回答

这个问题很可能是因为你在storyboard中配置了自定义的UITableViewCell,但是你没有使用storyboard来实例化你的UITableViewController,它使用这个UITableViewCell。例如,在MainStoryboard中,你有一个UITableViewController子类,叫做MyTableViewController,还有一个自定义动态UITableViewCell,叫做MyTableViewCell,标识符id为MyCell。

如果你像这样创建你的自定义UITableViewController:

 MyTableViewController *myTableViewController = [[MyTableViewController alloc] init];

它不会自动为你注册你的自定义tableviewcell。您必须手动注册它。

但是如果你使用storyboard来实例化MyTableViewController,像这样:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyTableViewController *myTableViewController = [storyboard  instantiateViewControllerWithIdentifier:@"MyTableViewController"];

好事发生了!UITableViewController会自动注册你在storyboard中定义的自定义tableview单元格。

在你的委托方法"cellForRowAtIndexPath"中,你可以像这样创建你的表格视图单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

//Configure your cell here ...

return cell;
}

如果循环队列中没有可重用的单元格,dequeueReusableCellWithIdentifier将自动为您创建新的单元格。

那么你就完成了!

其他回答

使用Swift 3.0:

override func viewDidLoad() {
super.viewDidLoad()

self.myList.register(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "Cell")
}



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = myList.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as! MyTableViewCell

return cell
}

只是对答案的补充: 可能有一段时间你把所有的东西都设置对了,但你可能不小心在你的.xib中添加了一些其他的ui,比如UIButton: 只要删除额外的UI,它就能工作。

你正在使用dequeueReusableCellWithIdentifier:forIndexPath:方法。该方法的文档是这样说的:

重要提示:在调用此方法之前,必须使用registerNib:forCellReuseIdentifier:或registerClass:forCellReuseIdentifier:方法注册类或nib文件。

您没有为重用标识符“Cell”注册nib或类。

看看你的代码,你似乎期望dequeue方法返回nil,如果它没有一个单元格给你。对于这种行为,你需要使用dequeueReusableCellWithIdentifier::

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

注意dequeueReusableCellWithIdentifier:和dequeueReusableCellWithIdentifier:forIndexPath:是不同的方法。前者和后者见医生。

如果你想了解为什么你想要使用dequeueReusableCellWithIdentifier:forIndexPath:,看看这个问答。

遇到这个错误bc单元复用标识符是错误的-一个新手错误,但它发生了: 1. 确保单元格重复使用标识符没有拼写错误或缺少字母。 2. 同样的,不要忘记大写的重要性。 3.0不是O(哦)

确保故事板中单元格的CellIdentifier ==标识符,两个名称是相同的。希望这对你有用