【发布时间】: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 数据库中的值为
null,someRecord将填充有(null)字符串值。如果我使用[someRecord isEqualToString:@"(null)"]并记录它,我看不到任何空记录。但我仍然无法对其进行排序。也许我需要使用一些 sqlite 函数? -
排序方法将在 NSString @"(null)" 上工作,因为它响应
localizedCaseInsensitiveCompare:。它不适用于 NSNull,这就是它没有被调用的原因。您可能不希望数组中有 @"(null)" ,但这不会阻止它的工作。在调用sortedArrayUsingSelector:之前,需要从数组appDelegate.myNonSortedArray中删除任何 NSNull 实例。如果它们都已被删除,那么您将不会收到此错误消息。
标签: ios objective-c sorting nsmutablearray unrecognized-selector