Iphone UITableView作为NIB中的子视图存在问题

Iphone UITableView作为NIB中的子视图存在问题,iphone,cocoa-touch,uitableview,nib,Iphone,Cocoa Touch,Uitableview,Nib,执行摘要:我试图使用UITableView作为窗口“主”视图的子视图;它会出现,但当我滚动窗口时,会收到以下错误消息: 2010-11-20 17:17:51.958 xwtf[6997:207]-[NSCFString tableView:cellForRowAtIndexPath:]:发送到实例0x5f46550的无法识别的选择器 我有一个子类ViewController,其中包含由我的应用程序委托加载的相应NIB文件。这是典型的新项目模板。在该NIB文件中,我添加了一个UITableVie

执行摘要:我试图使用
UITableView
作为窗口“主”视图的子视图;它会出现,但当我滚动窗口时,会收到以下错误消息:

2010-11-20 17:17:51.958 xwtf[6997:207]-[NSCFString tableView:cellForRowAtIndexPath:]:发送到实例0x5f46550的无法识别的选择器

我有一个子类
ViewController
,其中包含由我的应用程序委托加载的相应NIB文件。这是典型的新项目模板。在该NIB文件中,我添加了一个
UITableView
作为视图的子视图。在Interface Builder中,我调整它的大小以占据整个窗口(即,它完全重叠其父视图)

现在我需要指定一个数据源和委托。我创建了一个名为
DumbTableHelper
的类,如下所示:

@interface DumbTableHelper : NSObject<UITableViewDelegate, UITableViewDataSource> {
}
如你所见,我甚至没有配置任何单元;我只指定了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:cellforrowatinexpath:
。。一串有人有什么想法吗

如果这是一个愚蠢的问题,我很抱歉——到目前为止,我所有的表视图都是由
UITableViewController
实例以编程方式创建的,但是现在我需要添加一个
UITableView
作为子视图,它不会占用整个屏幕。我已经阅读了《苹果桌面视图指南》和《iPhone开发入门指南》,以确保我没有遗漏任何东西,但毫无用处


谢谢

我建议删除Interface Builder中的连接并尝试重新建立。显然,数据源出口似乎已连接到nib中的NSString。您也可以尝试使用UITableView的委托和数据源属性在代码中建立连接。

好的,我已经找到了原因:我的
ViewController
子类也充当NIB文件中的文件所有者,它没有声明的
DumbTableHelper
的出口。关于Nib文件的资源编程指南,位于:

nib文件中的对象创建时保留计数为1,然后自动删除。。。如果为nib文件对象定义出口,则应始终定义用于访问该出口的setter方法(或声明的属性)。插座的Setter方法应保留其值,包含顶级对象的插座的Setter方法必须保留其值,以防止释放它们

首次显示表格时,
DumbTableHelper
retainCount
仍然为1,并且尚未自动删除,因此可以使用它填充最初显示的行。然而,当我滚动时,它不再存在于内存中。从堆栈跟踪中,我们可以推测在
DumbTableHelper
以前所在的内存地址中分配了一个字符串,因此它错误地接收
tableView:cellforrowatinexpath:
消息


同样,只需将文件所有者的插座连接到Interface Builder文件中的
DumbTableHelper
实例即可解决问题。

感谢您的帮助!经过今天下午的进一步调查,我找到了原因。字符串实例是一个骗局,真的。。。有关详细信息,请参阅我的答案。我假设这与出现此错误时的问题相同:
-[CALayer tableView:CellForRowatineIndexPath:]:未识别的选择器发送到实例0x14563c90
。。ie
CALayer
而不是
NSCFString
(但我可以发誓我以前见过NSCString出现同样的问题)。。如果收到
CALayer
toohum.,请按喇叭。。这很有趣。。但我有两个问题:1。有人会假设这是一个应该通过使用ARC自动解决的问题(我从您的alloc dealloc引用推断这是非ARC代码)。。问题是我在使用ARC,但我仍然遇到同样的问题2。在您的情况下,您可以简单地引用故事板b/c中的数据源出口—您的数据源是单一的且已定义。。如果您使用在运行时定义的数据源(我就是这么做的..我对不同的数据源使用相同的uitableviewcontroller/tableview),该怎么办?你是怎么处理的?
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
)