Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 布尔方法没有';t在if语句中工作_Ios_Objective C - Fatal编程技术网

Ios 布尔方法没有';t在if语句中工作

Ios 布尔方法没有';t在if语句中工作,ios,objective-c,Ios,Objective C,我有一个存储联系人(字符串)的NSArray。我还有一个名为checkList的方法,用于查找现有联系人,如果某个用户不在联系人列表中,我会向当前用户提供一个警报视图,在该视图中,她可以将另一个用户添加到其联系人列表中。问题是,每当我点击按钮时,[self addContact]都会被调用,不管其他用户是否在联系人列表中。但是,只有当其他用户不在联系人列表中时,才应调用[self addContact] - (void) checkList { AppDelegate *contact

我有一个存储联系人(字符串)的
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
时,我都在调用
检查表
方法,但是有一个if语句可以处理这种情况。我认为问题在于BOOL,因为我可以正确地记录
开发日志
,它不是nil,并且包含正确的内容

- (IBAction) goButton {

[self checkList];

}
如果有人看到我做错了什么或有什么建议,听到这件事一定会很惊讶


当我记录BOOL时,它总是返回0,因此每次都是false,不管用户是否是联系人

我很惊讶您使用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) 
{
   .......
}

您确定self.stringToCompare中有您要添加的字符串吗?可能您的self.stringToCompare返回nil,如果是,Bool仍然返回NO,并且您的add contact方法将在每次调用检查列表时被调用。@user1190882是的,这是肯定的。我检查了几次,并在addContact方法中使用了该变量。您能否显示
contact.cArray
的实际日志(或者至少显示您认为匹配的记录)以及
self.stringToCompare
中包含的内容?我的猜测是,您的数组实际上包含了包含联系人详细信息的dictionary对象,而不仅仅是字符串。请向我们展示stringToCompare和cArray的实际NSLog输出。事实并非如此:“我很惊讶您使用了containsObject。此方法比较的是指针,而不是值。”。containsObject方法调用的是isEqual:,而不是相等运算符(=)@MarcosCrispino isEqual:将字符串与对象进行比较,如果对象不是字符串,则返回NO。我已经开始实现第二个版本,它要短得多。为什么您更喜欢第三个?@w88我更喜欢第三个,因为我在同一时间检索两个信息项的存在和数组中的索引。@tdelepine“isEqual:将字符串与对象进行比较,如果对象不是字符串,则返回否”,这正是您的代码所做的。