执行摘要:我正在尝试使用UITableView
作为我窗口“主要”视图的子视图;它出现了,但是当我滚动窗口时,我收到以下错误消息:
2010-11-20 17:17:51.958 xwtf[6997:207] -[NSCFString tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0x5f46550
我有一个ViewController
的子类,其中包含由我的应用程序委托加载的相应NIB文件。这是典型的新项目模板。在该NIB文件中,我添加了UITableView
作为视图的子视图。在Interface Builder中,我将其调整为占据整个窗口(即它与父视图完全重叠)。
现在我需要指定一个数据源和委托。我像这样创建一个名为DumbTableHelper
的类:
@interface DumbTableHelper : NSObject<UITableViewDelegate, UITableViewDataSource> {
}
所以,它不是UIViewController
的子类,但我试图保持这个简单 - 我需要的是它可以调用的委托和数据源,对吧?除dealloc
之外,我的.m文件中的方法是:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"DumbTableCell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier]
autorelease];
}
return cell;
}
正如您所看到的,我甚至没有配置任何单元格;我只指定10行,这足以强制滚动。无论如何,在Interface Builder中我将一个对象从库中拖到我的NIB中。然后我将其类名更改为DumbTableHelper
并将其指定为UITableView
已存在的数据源和委托。当我运行它时,表格出现。当我尝试向下滚动表格时,我得到:
010-11-20 18:19:54.673 xwtf[6997:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString tableView:cellForRowAtIndexPath:]: unrecognized selector sent to instance 0x5f46550'
*** Call stack at first throw:
(
0 CoreFoundation 0x0259eb99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x0239340e objc_exception_throw + 47
2 CoreFoundation 0x025a06ab -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x025102b6 ___forwarding___ + 966
4 CoreFoundation 0x0250fe72 _CF_forwarding_prep_0 + 50
5 UIKit 0x00321d6f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 619
6 UIKit 0x00317e02 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
7 UIKit 0x0032c69f -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1348
8 UIKit 0x003247ec -[UITableView layoutSubviews] + 242
9 QuartzCore 0x0455c481 -[CALayer layoutSublayers] + 177
10 QuartzCore 0x0455c1b1 CALayerLayoutIfNeeded + 220
11 QuartzCore 0x045552e0 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 302
12 QuartzCore 0x04555040 _ZN2CA11Transaction6commitEv + 292
13 QuartzCore 0x04585ebb _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
14 CoreFoundation 0x0257ff4b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
15 CoreFoundation 0x02514b27 __CFRunLoopDoObservers + 295
16 CoreFoundation 0x024ddce7 __CFRunLoopRun + 1575
17 CoreFoundation 0x024dd350 CFRunLoopRunSpecific + 208
18 CoreFoundation 0x024dd271 CFRunLoopRunInMode + 97
19 GraphicsServices 0x02d5d00c GSEventRunModal + 217
20 GraphicsServices 0x02d5d0d1 GSEventRun + 115
21 UIKit 0x002beaf2 UIApplicationMain + 1160
22 xwtf 0x00001af4 main + 102
23 xwtf 0x00001a85 start + 53
)
所以它在..字符串上调用tableView:cellForRowAtIndexPath:
?有人有什么想法吗?
如果这是一个愚蠢的问题,我很抱歉 - 到目前为止我的所有表格视图都是由UITableViewController
个实例以编程方式创建的,但现在我需要添加一个UITableView
作为子视图,不占用整个屏幕。我已经阅读了关于桌面视图和开始iPhone开发的Apple指南,以确保我没有遗漏任何东西,但无济于事。
谢谢!
答案 0 :(得分:4)
好的,我已经弄清楚了原因:我的ViewController
的子类在我的NIB文件中也作为文件所有者没有声明出口到DumbTableHelper
。 http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html上的Nib文件资源编程指南说:
nib文件中的对象是使用保留计数1创建的,然后自动释放...如果为nib文件对象定义出口,则应始终定义用于访问该出口的setter方法(或声明的属性)。出口的Setter方法应保留其值,并且包含顶级对象的出口的setter方法必须保留其值以防止它们被释放。
首次显示表时,DumbTableHelper
的{{1}}仍为1,尚未自动释放,因此可用于填充最初显示的行。但是,当我滚动时,它不再存在于内存中。从堆栈跟踪中,我们可以推测已经在retainCount
曾经存在的内存地址中分配了一个字符串,因此它会错误地接收DumbTableHelper
消息。
同样,只需将文件所有者的插座连接到Interface Builder文件中的tableView:cellForRowAtIndexPath:
实例即可解决问题。
答案 1 :(得分:0)
我建议在Interface Builder中删除您的连接并尝试重新建立。看起来好像dataSource出口已连接到nib中的NSString。您也可以尝试使用UITableView的委托和数据源属性在代码中建立连接。