0

我正在尝试实现此按钮操作,但 if 语句未评估为真。我有一种情况,即“学校”字典中的值并不总是存储一个网站。出于这个原因,我想检查,但我要检查什么。如果没有值时没有存储“nil”,那是什么?

 -(IBAction) btnVisitWebsite_clicked :(id)sender {

if([School objectForKey:WEBSITE_KEY] == nil){

    UIAlertView *NoWebsite = [[UIAlertView alloc]initWithTitle: @"No Website"
                                                message:@"The selected school has not listed a website"
                                                delegate:self
                                                cancelButtonTitle:@"OK"
                                                otherButtonTitles:nil];

    NoWebsite.tag = 15;
    [NoWebsite show];
    [NoWebsite release];
    NoWebsite = nil;
}

else{

NSMutableString *WebsiteVisit = [[NSMutableString alloc] initWithString: @"http://"];
[WebsiteVisit appendString:[School objectForKey:WEBSITE_KEY]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: WebsiteVisit]];


[WebsiteVisit release];

}
}
4

4 回答 4

3

如果网站可能是一个空字符串,您应该使用以下内容:

if(![School objectForKey:WEBSITE_KEY] 
   || ([[School objectForKey:WEBSITE_KEY] isKindOfClass:[NSString class]] && [(NSString*)[School objectForKey:WEBSITE_KEY] length]==0)){
    // no website
} else { /* has website*/ }
于 2010-01-14T14:24:20.823 回答
1

NSDictionary 不能包含 nil。如果密钥存在,它必须包含一个对象。如果没有为特定键定义对象,则该objectForKey:方法将返回。nil但是,您可以在字典或数组中存储[NSNull null]为空占位符。所以你可以检查一下,这完全取决于你的字典是如何填充的。

[School objectForKey:WEBSITE_KEY] == nil || [School objectForKey:WEBSITE_KEY] == [NSNull null]

还要确保您不会将 @"" 与 nil 或没有值混淆。如果它不是 nil 而不是 [NSNull null] 那么最好记录它,也许看看正在存储什么对象:

NSLog(@"Description: %@", [School objectForKey:WEBSITE_KEY]);
NSLog(@"Class: %@", [[School objectForKey:WEBSITE_KEY] class]);

如果该类返回一个 NSString 或 NSCFString ,那么它看起来就像包含一个空字符串。你可以检查一下。这是完整的声明:

id schoolWebsite = School objectForKey:WEBSITE_KEY];
if (schoolWebsite && schoolWebsite != [NSNull null] && [schoolWebsite isKindOfClass:[NSString class]] && [schoolWebsite length] > 0)) {
    // There is definitely a non-empty string for that key!
} else {
    // Not valid
}

这将很好用,因为您可能不确定字典中存储的确切内容,因为其他人将填充它。你永远不能太小心!

于 2010-01-14T14:06:26.397 回答
1

您是否尝试过使用NSLog来打印 key 的对象?

NSLog(@"School[WEBSITE_KEY]=<%@>", [School objectForKey:WEBSITE_KEY]);

也许它不是 nil ?

于 2010-01-14T14:06:44.320 回答
1

通过检查是否有条目来查看请求的学校是否在 NSDictionary 中

BOOL containsKey = [[School allKeys] containsObject:WEBSITE_KEY];

如果没有学校网站,则不应有 WEBSITE_KEY 的目录条目。

于 2010-01-14T14:07:40.443 回答