繁体   English   中英

tableView中奇怪的BOOL行为(何时1不等于1?)

[英]Strange BOOL behavior in tableView (When is 1 not equal to 1?)

我正在尝试将现有应用程序转换为使用核心数据。 我已经设置了实体,并且正在使用NSFetchedResultsController在表视图中显示数据。 现在,我只是在每次启动应用程序时填充数据库。

除了一个奇怪的问题之外,它似乎运行良好。 我的实体具有BOOL值“ showStarCorner”,该值确定是否应在表格单元格中显示星星的图像...因此,在配置每个表格视图单元格时,我调用类似于以下if语句的东西:

if (myObject.showStarCorner == [NSNumber numberWithBool:YES]) {
    // show the star corner
}

但是令人惊讶的是,这导致星星只显示在我在应用启动时创建的对象上。 (在应用的先前启动中添加的应该显示星星的对象没有)

我添加了一个额外的测试,以帮助找出问题所在:

if (myObject.showStarCorner == [NSNumber numberWithBool:YES]) {
    NSLog(@"%@ == %@", myObject.showStarCorner, [NSNumber numberWithBool:YES]);
}
else if (myObject.showStarCorner != [NSNumber numberWithBool:YES]) {
    NSLog(@"%@ != %@", myObject.showStarCorner, [NSNumber numberWithBool:YES]);
}

...这将导致为先前添加的对象调用else语句:

1 != 1

据我所知,1应该总是等于1 ...所以我完全困惑。

我将不胜感激任何帮助。 可能与每次应用启动时创建的具有相同属性的新对象有关吗? (我没有分配任何唯一的ID或任何东西,只是按添加日期对结果进行排序)

NSNumber*变量是指针,指针上的==检查指针是否相等。 由于您的对象不共享相同的内存位置(因为它们是通过[NSNumber numberWithBool:]的不同调用创建的),因此它们不被视为等于指针的指针(因此,比较返回NO )。

请改用isEqual:方法,该方法应检查值是否相等并且在大多数类中都可用,或者从您的NSNumber对象中获取boolValue并进行比较。

if (myObject.showStarCorner.boolValue == YES) {
    // show the star corner
}

if ([myObject.showStarCorner isEqual:[NSNumber numberWithBool:YES]]) {
    // show the star corner
}

不能仅仅因为对象指向相同的数据就保证它们相等。 您需要使用-isEqual:方法测试是否相等,而不是==:

if ([myObject.showStarCorner isEqual: [NSNumber numberWithBool: YES]) {
    //show the star corner
}

比较BOOL原语:

if ([myObject.showStarCorner boolValue] == YES) {

// Alternatively,
if ([myObject.showStarCorner boolValue]) {

否则,您将尝试比较不同的NSNumber对象的内存地址,这是行不通的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM