【问题标题】:Sort NSString objects in NSMutableArray对 NSMutableArray 中的 NSString 对象进行排序
【发布时间】:2014-04-27 11:49:28
【问题描述】:

我已经初始化了 NSMutableArray 并用来自 sqlite 数据库的 AppDelegate.m 中的 NSString 对象填充。现在我已经在我的视图控制器中设置了 AppDelegate :

appDelegate = (IBUAppDelegate *)[[UIApplication sharedApplication] delegate];

所以我可以像这样访问我的 NSMutableArray 对象:

[appDelegate.myNonSortedArray objectAtIndex:row];

现在我在视图控制器的@interface 部分创建了一个 NSMutable 数组,因此我可以使用来自 AppDelegate.m 的 NSMutableArray 中的排序 NSString 对象填充它。

@interface IBULanguageViewController ()
{
    IBUAppDelegate *appDelegate;
    NSMutableArray *myArraySorted;
}
@end

然后我尝试使用来自 AppDelegate.m 的 NSMutableArray 中的排序 NSStrings 填充 myArraySorted - (void)viewDidLoad 方法,以便在我的表视图控制器中创建单元格期间访问排序数组。

- (void)viewDidLoad
{
    [super viewDidLoad];
    appDelegate = (IBUAppDelegate *)[[UIApplication sharedApplication] delegate];
    myArraySorted = [[NSMutableArray alloc] init];

    [myArraySorted addObjectsFromArray:[appDelegate.myNonSortedArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]];
}

我得到 [NSNulllocalizedCaseInsensitiveCompare:]: unrecognized selector sent to instance 0x1a51068

【问题讨论】:

  • 数组中的一个“字符串”实际上是一个NSNull,它不响应选择器(至少错误消息是这么说的!)
  • 是的,这是因为数据库中的某些记录具有null 值。我已经通过使用if(![someRecord isEqualToString:@"(null)"]) 摆脱了它们,这样我就可以将someRecord 添加到我的NSMutableArray 中。据我所知,我的数组中没有NSNull。我该如何检查?
  • 如果someRecord 真的是NSNull,那么该检查将不起作用,因为NSNull 不响应[someRecord isEqualToString:@"(null)"] 打算检查该值是否为NSNull 你会做if (![someRecord isKindOfClass:[NSNull class]])。如果没有太多记录,那么您可以记录数组以检查这一点,即NSLog (@"unsorted: %@", appDelegate.myNonSortedArray); NSNulls 将被打印(空)到控制台(或者您可以通过添加断点在调试器中检查数组在相关位置。
  • 该检查也不起作用,因为如果在 sqlite 数据库中的值为 nullsomeRecord 将填充有 (null) 字符串值。如果我使用[someRecord isEqualToString:@"(null)"] 并记录它,我看不到任何空记录。但我仍然无法对其进行排序。也许我需要使用一些 sqlite 函数?
  • 排序方法将在 NSString @"(null)" 上工作,因为它响应 localizedCaseInsensitiveCompare:。它不适用于 NSNull,这就是它没有被调用的原因。您可能不希望数组中有 @"(null)" ,但这不会阻止它的工作。在调用 sortedArrayUsingSelector: 之前,需要从数组 appDelegate.myNonSortedArray 中删除任何 NSNull 实例。如果它们都已被删除,那么您将不会收到此错误消息。

标签: ios objective-c sorting nsmutablearray unrecognized-selector


【解决方案1】:

问题是您的未排序数组中有NSNulls。你需要在调用sortedArrayUsingSelector: 之前删除这些,事实上你数组中的所有东西都必须实现选择器localizedCaseInsensitiveCompare:(几乎必须是一个字符串)。您可以通过首先遍历数组并调用 [obj repsondsToSelector:@selector (localizedCaseInsensitiveCompare:] 来检查所有内容是否都响应了选择器,任何没有响应的都会破坏排序方法。

【讨论】:

  • 是的,我已经使用 [appDelegate.myUnsortedArray removeObjectIdenticalTo:[NSNull null]]; 删除了所有 NSNull 对象,sortedArrayUsingSelector: 现在可以使用了。
猜你喜欢
  • 2013-11-08
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多