iphone - UITableView 作为 NIB 中的 subview 的问题

标签 iphone cocoa-touch uitableview nib

执行摘要:我正在尝试使用 UITableView 作为窗口“主” View 的 subview ;它出现了,但是当我滚动窗口时,我收到以下错误消息:

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

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

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

@interface DumbTableHelper : NSObject<UITableViewDelegate, UITableViewDataSource> {
}

所以,它不是 UIViewController 的子类,但我试图保持简单 - 我所需要的只是它可以调用的委托(delegate)和数据源,对吧?除了 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 的数据源和委托(delegate)。当我运行它时,会出现该表。当我尝试在表格中向下滚动时,我得到:

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:?大家有什么想法吗?

如果这是一个愚蠢的问题,我很抱歉 - 到目前为止,我所有的表格 View 都是由 UITableViewController 实例以编程方式创建的,但现在我需要添加一个 UITableView 作为 subview ,不占据整个屏幕。我已经阅读了有关表格 View 和开始 iPhone 开发的 Apple 指南,以确保我没有遗漏任何内容,但无济于事。

谢谢!

最佳答案

好的,我已经找到原因了:我的 ViewController 子类(同时也是我的 NIB 文件中的文件所有者)没有声明 DumbTableHelper 的导出。 Nib 文件的资源编程指南位于 http://developer.apple.com/library/mac/documentation/cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html说:

Objects in the nib file are created with a retain count of 1 and then autoreleased... If you define outlets for nib-file objects, you should always define a setter method (or declared property) for accessing that outlet. Setter methods for outlets should retain their values, and setter methods for outlets containing top-level objects must retain their values to prevent them from being deallocated.

当表格首次显示时,DumbTableHelperretainCount 仍然为 1,并且尚未自动释放,因此它可用于填充最初显示。然而,当我滚动时,它不再存在于内存中。从堆栈跟踪中,我们可以推测 DumbTableHelper 原来所在的内存地址已经分配了一个字符串,因此它错误地收到了 tableView:cellForRowAtIndexPath: 消息.

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

关于iphone - UITableView 作为 NIB 中的 subview 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4239722/

相关文章:

iphone - 似乎不可能 : to animate the height change of row in UITableView

iphone - 有没有比使用 plist 保存应用内购买更安全的解决方案?

ios - UIWebView:502 错误网关响应

objective-c - 复制 UIView

iphone - 在 NSURLConnection 下载期间更新 iPhone UIProgressView

ios - UITableViewCell 中 UITextField View 的边框颜色

ios - Storyboard中的深灰色导航栏

ios - ios如何处理同一设备上不同用户的应用内购买自动续订订阅?

ios - UITableView的reloadRowsAtIndexPaths : seems to break insertRowsAtIndexPaths:

ios 7 - 自定义 UIMenuItem 不适用于 TableViewCell