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:将字符串与对象进行比较,如果对象不是字符串,则返回否”,这正是您的代码所做的。