我知道有很多关于同样事情的问题,但到目前为止我还没有能够对我的问题应用任何解决方案。而且我还没有想出如何使用乐器。
我正在为iPhone应用程序提供一个基本教程,并且只是尝试稍微调整它(我是Objective C的新手)。我希望它从带有一系列dicts而不是字符串数组的plist中读取。该表最初正确显示数据。但是,每当我向上滚动表格(并在屏幕外)时,我都会收到无法识别的选择器异常。只需用NSStrings填充员工就可以了。我搞不清楚了。
ViewController的相关部分:
@interface RootViewController : UITableViewController {
NSMutableArray *employees_;
}
@property (nonatomic, retain) NSMutableArray *employees;
@end
和
@implementation RootViewController
@synthesize employees=employees_;
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"Employees" ofType:@"plist"];
NSMutableArray *empArray = [[NSMutableArray alloc] initWithContentsOfFile:path];
employees_ = [empArray valueForKey:@"name"];
[empArray release];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = [self.employees objectAtIndex:indexPath.row];//this is where it errors
return cell;
}
- (void)dealloc
{
[employees_ release];
[super dealloc];
}
@end
和plist:
array
dict
key name /key
string Employee One /string
key id /key
string T1234 /string
/dict
dict
key name /key
string Employee Two /string
key id /key
string T5678 /string
/dict
/array
我收到错误:
2011-10-18 20:02:44.313 MyApp[65148:bc03] -[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x689a050 2011-10-18 20:02:44.316 MyApp[65148:bc03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x689a050' *** Call stack at first throw: ( 0 CoreFoundation 0x00dc25a9 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x00f16313 objc_exception_throw + 44 2 CoreFoundation 0x00dc40bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x00d33966 ___forwarding___ + 966 4 CoreFoundation 0x00d33522 _CF_forwarding_prep_0 + 50 5 MyApp 0x00002a96 -[RootViewController tableView:cellForRowAtIndexPath:] + 326 6 UIKit 0x00089b98 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634 7 UIKit 0x0007f4cc -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 8 UIKit 0x000948cc -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 9 UIKit 0x0008c90c -[UITableView layoutSubviews] + 242 10 QuartzCore 0x016aca5a -[CALayer layoutSublayers] + 181 11 QuartzCore 0x016aeddc CALayerLayoutIfNeeded + 220 12 QuartzCore 0x016540b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 13 QuartzCore 0x01655294 _ZN2CA11Transaction6commitEv + 292 14 QuartzCore 0x0165546d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 15 CoreFoundation 0x00da389b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 16 CoreFoundation 0x00d386e7 __CFRunLoopDoObservers + 295 17 CoreFoundation 0x00d011d7 __CFRunLoopRun + 1575 18 CoreFoundation 0x00d00840 CFRunLoopRunSpecific + 208 19 CoreFoundation 0x00d00761 CFRunLoopRunInMode + 97 20 GraphicsServices 0x00ffa1c4 GSEventRunModal + 217 21 GraphicsServices 0x00ffa289 GSEventRun + 115 22 UIKit 0x00022c93 UIApplicationMain + 1160 23 MyApp 0x00002249 main + 121 24 MyApp 0x000021c5 start + 53 ) terminate called throwing an exceptionCurrent language: auto; currently objective-c (gdb)
答案 0 :(得分:3)
有两个潜在的问题:
您需要确保对employees_ = [empArray valueForKey:@"name"]
的调用实际上是在返回NSArray
一旦排除了一个,并且假设您没有使用ARC,那么您的employees_ivar将在表视图有机会进行自我配置之前被释放。尝试
employees_ = [[empArray valueForKey:@"name"] retain];
然后在viewDidUnload&中释放employees_ dealloc方法。
很难从堆栈中告诉它,因为它确实说你的ivar是一个NSCFString但它可能只是因为它引用了一个无效/垃圾内存地址。根据你的plist描述,可能是因为#1点。
答案 1 :(得分:0)
-[NSCFString objectAtIndex:]: unrecognized selector
这意味着您尝试在类objectAtIndex:
的实例(与NSString相同)上发送选择器(即调用方法)NSCFString
。 (“下一步/核心基础字符串”)
你做不到。
由于您只在上面的代码中的一个位置调用objectAtIndex:因此很容易看出问题所在。 (除了在你的调试器中,你应该能够看到它发生了什么行。)你正在调用[self.employees objectAtIndex:...]
。显然你期望self.employees是一个数组,但它是一个字符串。我真的不知道plist处理,所以弄清楚为什么员工得到一个字符串以及如何让它得到一个数组取决于你。