1

好的。我已经搜索和搜索无济于事,我一直在努力解决这个问题。

我正在尝试确定 UITextField 是否具有空白值,如果是,则将空值发送到服务器,而不仅仅是空白字符串。

以下代码

NSDictionary *locationDict = @{
    @"country":countryVal,
    @"state":stateVal,
    @"city":[cityField.text isEqualToString:@""] ? [NSNull null] : cityField.text
};
NSLog(@"%@", locationDict);

记录这个

{
    city = "<null>";
    country = US;
    state = TN;
}

我无法弄清楚为什么[NSNull null]会在"<null>". 如果用户不输入值,应用程序会继续将该字符串作为城市发送,显然不是我想要的。我没有在这里显示网络调用,但我正在使用 AFNetworking 来执行此操作。不过,在我调用 AFN 之前,我可以确认字典包含该字符串而不是 null。所以我知道问题不在于AFN。

任何帮助是极大的赞赏。

4

4 回答 4

7

<null>是 的结果[[NSNull null] description]。您可以使用NSLog(@"%@", [NSNull null]);. 如果您想要<null>用户不输入城市时以外的其他内容,请使用您想要的值而不是[NSNull null]在您的 line@"city":[cityField.text isEqualToString:@""] ? [NSNull null] : cityField.text中。

于 2013-01-24T00:19:32.063 回答
2

当您记录一个 Obj-C 对象(使用%@)时,NSLog 函数将实际调用-(NSString*)description它并打印返回的任何字符串。此方法继承自NSObjectNSDictionary已覆盖它。它创建一个字符串,它是一个键/值对列表,由花括号分隔=并包裹在花括号中。因此它将调用description该字典的任何键和任何值。如果你调用description一个NSNull对象,它会返回字符串<null>。的desription方法NSNull如下所示:

- (NSString *)description
{
    return @"<null>";
}

周围的引号由 加上NSDictionary,因为每个包含 ASCII 字母和数字以外的字符(在本例中为<and >)的字符串都包含在引号中。如果您替换USbyUS.TNby !TN,则这两个也在引号中。

我不明白的是你为什么首先使用NSNull。将空字符串放入字典中没有问题,服务器可以简单地检查字符串是否为空。

NSDictionary *locationDict = @{
    @"country":@"US",
    @"state":@"TN",
    @"city":@""
};
NSLog(@"%@", locationDict);

输出

{
    city = "";
    country = US;
    state = TN;
}
于 2013-01-24T00:26:47.620 回答
0

如果您需要一个以不同方式描述自己的空值,您可以考虑将 NSNull 子类化,或者您可以将 NSValue 子类化——子类化 NSValue 可以为您提供可以解码/编码为 NSPropertyList 的东西的额外好处。

于 2013-01-24T01:27:41.007 回答
0

关于 [[NSNull null] description] 的答案是正确的。

IMO 如果您想向服务器发送“空”值,请不要填充该键/值对。如果你想在这里做一些特别的事情,你必须预处理字典。

这在很大程度上取决于您是否可以控制服务器处理事物的方式以及您发送的格式。

将 NSNull 转换为 nil 并返回到集合处理代码中的代码是非常典型的。

于 2013-01-24T00:31:15.097 回答