一般说明:
首先,我有一个UITableView
使用 Interface Builder 放置在 Xcode 生成的视图上的内容。视图的文件所有者设置为 Xcode 生成的UIViewController
. 在这个子类中,我添加了和表视图的工作实现,并通过numberOfSectionsInTableView: tableView:numberOfRowsInSection:
接口生成器中的文件所有者连接到这个类。tableView:cellForRowAtIndexPath:
dataSource
delegate
上面的配置没有问题。当我想将此表视图的dataSource
和delegate
- 实现移到单独的类时会出现此问题,很可能是因为除了表视图之外视图上还有其他控件,我想将表视图相关的代码移到它的自己的班级。为此,我尝试以下方法:
UITableViewController
在 Xcode 中创建一个新的子类- 将
numberOfSectionsInTableView:
,tableView:numberOfRowsInSection:
和的已知良好实现移动tableView:cellForRowAtIndexPath:
到新的子类 - 将 a拖到 InterfaceBuilder 中现有XIB
UITableViewController
的顶层 ,删除为此自动创建的/ ,然后设置的类以匹配新的子类UIView
UITableView
UITableViewController
UITableViewController
- 删除以前工作
UITableView
的现有dataSource
和delegate
连接并将它们连接到新的UITableViewController
完成后,我没有工作UITableView
. 我最终得到了三个看似随机发生的结果之一:
- 加载时
UITableView
,我收到一个运行时错误,表明我正在发送tableView:cellForRowAtIndexPath:
到一个无法识别它的对象 - 加载时
UITableView
,项目无错误地进入调试器 - 没有错误,但
UITableView
没有出现
通过一些调试并创建了一个基本项目来重现此问题,我通常会看到上面的第三个选项(没有错误但没有可见的表格视图)。我添加了一些 NSLog 调用,发现虽然numberOfSectionsInTableView:
和numberOfRowsInSection:
都被调用,但cellForRowAtIndexPath:
不是。我确信我错过了一些非常简单的东西,并希望答案对于比我更有经验的人来说可能是显而易见的。如果这不是一个简单的答案,我很乐意用一些代码或示例项目进行更新。谢谢你的时间!
完整的重现步骤:
- 在 Xcode 中创建一个新的 iPhone OS,基于视图的应用程序并调用它
TableTest
TableTestViewController.xib
在 Interface Builder 中打开并将 aUITableView
拖到提供的视图表面上。- 将
UITableView
'sdataSource
和delegate
-outlets 连接到应该已经代表TableTestViewController
-class 的 File's Owner。保存您的更改 - 回到 Xcode,将以下代码添加到
TableTestViewController.m:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
NSLog(@"Returning num sections");
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Returning num rows");
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Trying to return cell");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
cell.text = @"Hello";
NSLog(@"Returning cell");
return cell;
}
Build and Go,你应该会看到这个词
Hello
出现在UITableView
现在尝试将 this
UITableView
的逻辑移到一个单独的类中,首先在 Xcode 中创建一个新文件,选择UITableViewController
子类并调用该类TableTestTableViewController
- 把上面的代码片段去掉,
TableTestViewController.m
放到 里面TableTestTableViewController.m
,把这三个方法的默认实现替换成我们的。 - 返回同一文件中的 Interface Builder
TableTestViewController.xib
,将 aUITableViewController
拖入主 IB 窗口并删除UITableView
自动附带的新对象 - 将这个新的类设置
UITableViewController
为TableTestTableViewController
- 从现有的、先前工作的中删除
dataSource
和绑定,然后将相同的两个绑定重新连接到我们创建的新绑定。delegate
UITableView
TableTestTableViewController
- 保存更改,构建并开始,如果你得到我得到的结果,请注意
UITableView
不再正常运行
解决方案:
通过更多故障排除和来自iPhone 开发者论坛的帮助,我记录了一个解决方案!项目的主要UIViewController
子类需要一个指向UITableViewController
实例的出口。为此,只需将以下内容添加到主视图的标题 ( TableTestViewController.h
) 中:
#import "TableTestTableViewController.h"
和
IBOutlet TableTestTableViewController *myTableViewController;
然后,在 Interface Builder 中,将 File's Owner 的新出口连接到TableTestTableViewController
主 IB 窗口中。XIB 的 UI 部分无需更改。只需设置此插座,即使没有用户代码直接使用它,也可以完全解决问题。感谢那些帮助并感谢 iPhone 开发者论坛上的 BaldEagle 找到解决方案的人。