【问题标题】:NSArray objectAtIndex is not working. Please helpNSArray objectAtIndex 不工作。请帮忙
【发布时间】:2010-06-23 14:00:13
【问题描述】:
NSArray* address = [NSArray arrayWithArray:[detailItem addressArray]];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int arrayCount = [address count];
for (int i = 0; i < arrayCount; i++) {
    addressToString = [addressToString stringByAppendingString:[address objectAtIndex:i]];
    if (i == arrayCount -1) {
        addressToString = [addressToString stringByAppendingString:@""];
    } else {
        addressToString = [addressToString stringByAppendingString:@", "];
    }       
}

address 是一个保存地址的 NSArray

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
        {
        City = "Cupertino";
        Country = "United States";
        CountryCode = us;
        State = CA;
        Street = "1 Infinite Loop";
        ZIP = 95014;
    }
)

我正在尝试遍历数组并创建一个 CSV 字符串,使其看起来像

Cupertino, "United States", us, CA, "1 Infinite Loop", 95014

但是,我一直在崩溃

addressToString = [addressToString stringByAppendingString:@", "];

我收到的消息是

*** -[NSCFDictionary stringByAppendingString:]:无法识别的选择器发送到实例 0x1c2f10

更新: detailItem 是 ABContact 类型的对象(自定义类)。

ABContact 有一个名为 addressArray 的属性

@property (nonatomic, readonly) NSArray *addressArray;

我的addressArray的定义是

- (NSArray *) addressArray {return [self arrayForProperty:kABPersonAddressProperty];}

【问题讨论】:

  • 错误信息是自描述的——地址对象不是一个数组——它是一个字典,你应该相应地处理它。
  • 我的类从 ABContact 类返回一个 NSArray 怎么样?

标签: cocoa iphone-sdk-3.0 nsstring nsarray appkit


【解决方案1】:

您的“地址”是 NSDictionary 的 NSArray,而不是 NSArray 的 NSArray。

要将字典的值作为数组获取,可以使用

[theDictionary allValues]

但订单上没有保证。我认为你真正需要的是:

NSMutableString* addressToString = [NSMutableString string];  // use mutable string!
for (NSDictionary* item in address) {     // use fast enumeration!
  [addressToString appendFormat:@"%@, \"%@\", %@, %@, \"%@\", %@\n",
   [item objectForKey:@"City"], 
   /* etc ... */
  ];
}

【讨论】:

  • 唯一的问题是我传入的模型(detailItem)并不总是具有所有相同的属性。有些地址没有城市,州有些地址有邮政编码和州所以我怎样才能(以编程方式)确定要包含的内容。 Google 不喜欢使用 NSMutableString。 maps.google.com/maps/geo?q=%@&output=csv
  • @orangecl4now an NSMutableString is an NSString,任何可以使用NSString的地方都可以使用NSMutableString
  • @orange:如果城市不存在,-objectForKey: 将返回nil
  • orangecl4now:Google 对 NSMutableString 没有意见;实际上,您传递的对象类别并不重要。将nil 传递给%@ 说明符将导致输出出现“(null)”,因此objectForKey: 返回nil 不是问题。您生成 URL 的代码有其他问题。
【解决方案2】:

这个:

2010-06-23 09:05:19.346 iPhoneExample[1093:207] address = (
    {
    City = "Cupertino";
    Country = "United States";
    CountryCode = us;
    State = CA;
    Street = "1 Infinite Loop";
    ZIP = 95014;
}
)

NSDictionary。您将希望通过 [dictionary objectForKey:'City'] 访问其成员

因此,您更新后的代码应为:

NSDictionary* address = [detailItem addressArray];
NSLog(@"address = %@", address);
NSString* addressToString = @"";
int counter = 0;
for (id object in myDictionary) {
  if (counter != 0)
    addressToString = [addressToString stringByAppendingString:@","];
  addressToString = [addressToString stringByAppendingString:object];   
  counter++;
}

【讨论】:

  • 唯一的问题是字典objectEnumerator 不一定以任何顺序返回内容,因为字典本身不保持顺序。另外,您应该使用for..in 语法。它更简单。另外,您从未增加过counter。我已经为你编辑了代码。 :) 另外顺便说一句,这将创建一个 lot 额外的自动释放对象。我会改用NSMutableString
  • 谢谢!我忘了添加计数器增量... :) 我知道排序和自动释放对象的问题,但我想尽可能接近 OP 的原始代码。
  • huntaub:不,address 是一个 NSArray 实例(描述为(…))。它的唯一元素(描述为{…})是一个NSDictionary。
【解决方案3】:

如果您可以将 addressArray 方法更改为实际返回数组而不是字典,那么您可以这样做:

NSString * addressString = [[detailItem addressArray] componentsJoinedByString:@","];

就是这样……

【讨论】:

    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多