【问题标题】:"Null is returned from a method that is expected to return a non-null value" with cellForRowAtIndexPath“从预期返回非空值的方法返回空值”与 cellForRowAtIndexPath
【发布时间】:2017-01-14 08:18:10
【问题描述】:

在 iOS 10 下,会抛出此新警告。

在方法无法确定要返回的适当单元格的情况下(例如异常),从 cellForRowAtIndexPath 返回的适当方法是什么?

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(tableView == self.selectedContentTableView) {
        // make cell...

        return cell;
    }
    else if(tableView == self.recipientTableView) {
        // make cell...

        return cell;
    }
    else {
        NSLog(@"Some exception message for unexpected tableView");

        return nil; // ??? what now instead
    }
}

【问题讨论】:

  • 你真的应该知道你是否设计了两个以上的表格视图。 ;-)
  • 也许...但我真的不应该知道任何编码员在我之后添加的所有内容。 ;)
  • 你之后的任何编码员都要对自己负责。
  • 这对 iOS 10 来说并不新鲜。从来没有允许从 cellForRowAtIndexPath: 返回 nil 如果不是彻底崩溃,那可能是新的。而且不好。它应该会崩溃。
  • @vadian 所以如果我的车在高速公路上漏油,我可以说我后面的司机要为自己负责吗?不,这是草率的想法——试图将灰色区域变成黑色或白色。我负部分责任,他们负部分责任。我负责满足业务需求并尽我所能降低总拥有成本。这包括做出决策,以使我自己或其他人在系统上的未来工作尽可能有效和高效。

标签: objective-c uitableview ios10


【解决方案1】:

如果这种情况是不应该发生的编程错误, 那么适当的操作是终止程序并出现错误 消息,以便检测到编程错误并可以修复:

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(tableView == self.selectedContentTableView) {
        // make cell...

        return cell;
    }
    else if(tableView == self.recipientTableView) {
        // make cell...

        return cell;
    }
    else {
        NSLog(@"Some exception message for unexpected tableView");
        abort();
    }
}

abort() 函数标有__attribute__((noreturn)), 因此编译器不会抱怨缺少 返回值。

【讨论】:

  • 还有fatalError结合了abort和NSLog,还打印了文件和行号。
  • @Sulthan:在 Swift 中有fatalError()。它也存在于 Objective-C 中吗?
  • 哦,对了。我习惯于阅读快速的问题。我很抱歉。
【解决方案2】:

没有合适的值返回,因为情况是 100% 程序员错误。最好针对预期的情况(不同的tableview,基于模型数据的不同单元格类型等)编写代码,让任何未处理的情况通过并自然返回nil。检查此类情况只会通过故意隐藏错误来加重错误。

Apple 关于 Objective-C 中异常的理念是它们被用来表示程序员错误。当tableView:cellForRowAtIndexPath: 返回nil 时,UITableView 抛出异常是 UIKit 告诉您逻辑错误的方式。改正错误,不要把它盖在纸上。

【讨论】:

  • 我不认为 OP 想要“将其覆盖”。相反,他的代码中有 return nil;,这会导致运行时异常。问题在于,使用新的可空性注释,静态分析器会在return nil; 上抱怨。这就是我建议 abort() 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2014-09-24
相关资源
最近更新 更多