[英]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.