【问题标题】:BOOL method doesn't works in if statementBOOL 方法在 if 语句中不起作用
【发布时间】:2014-08-26 18:20:44
【问题描述】:

我有一个NSArray,用于存储我的联系人(字符串)。我还有一个名为checkList 的方法,它查找现有联系人,如果用户不在联系人列表中,我会向当前用户提供警报视图,她可以将其他用户添加到她的联系人列表中。问题是,当我点击按钮时,每次都会调用[self addContact],这并不重要,其他用户是否在联系人列表中。然而,[self addContact] 只有在其他用户不在联系人列表中时才应该被调用。

- (void) checkList {

    AppDelegate *contact = (AppDelegate*)[[UIApplication sharedApplication] delegate];

     BOOL isObjectThere = [contact.cArray containsObject: self.stringToCompare];

     NSLog(@" dev log %@", contact.cArray);

    if (!isObjectThere) {
         [self addContact];
    }

}

我知道每次用户点击goButton 时我都会调用checkList 方法,但是有一个if 语句可以处理这种情况。我认为问题出在 BOOL 上,因为我可以正确记录 dev log,它不是零,它包含正确的内容。

- (IBAction) goButton {

[self checkList];

}

如果有人看到我做错了什么或有任何建议,听到它会很高兴。

当我记录 BOOL 时,它总是返回 0,所以每次都是 false,用户是否联系都没有关系。

【问题讨论】:

  • 您确定self.stringToCompare 有您要添加的字符串吗?
  • 也许你的 self.stringToCompare 返回 nil ,如果是,Bool 无论如何都会返回 NO ,并且每次调用检查列表时都会调用你的 add contact 方法。
  • @user1190882 是的,这是肯定的。我检查了几次,并在 addContact 方法中使用了该变量。
  • 您能否显示contact.cArray 的实际日志(或至少您认为匹配的记录)以及self.stringToCompare 中包含的内容?我的猜测是您的数组实际上包含字典对象,其中包含有关联系人的详细信息,而不仅仅是字符串。
  • 向我们展示 stringToCompare 和 cArray 的实际 NSLog 输出。

标签: ios objective-c


【解决方案1】:

我很惊讶你使用 containsObject。此方法比较指针类型而不是对象的值。我希望你使用年份枚举函数

BOOL IsObjectThere = NO; 
[contact.cArray enumerateObjectsUsingBlock: ^ (NSString * obj, NSUInteger idx, BOOL * stop) {
     if ([obj isEqualToString: self.stringToCompare]) {
          isObjectThere = YES; 
         * stop = YES; // Stop enumerating 
     } 
     else {
         * stop = NO; // Continue enumerating 
     } 

}];

你也可以使用一个简单的循环:

BOOL IsObjectThere = NO; 
for (NSString* contactItem in contact.cArray)
{
     if ([obj isEqualToString: self.stringToCompare]) {
          isObjectThere = YES; 
          break;
     } 
}

最后我更喜欢使用:

NSUInteger index = [contact.cArray indexOfObjectWithOptions:NSEnumerationConcurrent 
                                                passingTest:^(NSString* obj, NSUInteger idx, BOOL *stop) 
                    {
                        if ([obj isEqualToString: self.stringToCompare]) {
                            *stop = YES;
                            return YES;
                        }
                        return NO;
                    }];
if (index != NSNotFound) 
{
   .......
}

【讨论】:

  • 这不是真的:“我很惊讶你使用 containsObject。这个方法比较的是指针而不是值”。方法 containsObject 调用 isEqual:,而不是相等运算符 (==)
  • @MarcosCrispino isEqual:将字符串与对象进行比较,如果对象不是字符串,则返回 NO。
  • 我已经开始实现第二个版本,它要短得多。为什么你更喜欢第三个?
  • @w88 我更喜欢第三个,因为我同时检索两个信息,即 Item 的存在和数组中的索引。
  • @tdelepine "isEqual: 将字符串与对象进行比较,如果对象不是字符串,则返回 NO" 这正是您的代码所做的。
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 2012-07-16
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多