如何从常规视图控制器推送表视图控制器?
Posted
技术标签:
【中文标题】如何从常规视图控制器推送表视图控制器?【英文标题】:How to push a table view controller from a regular view controller? 【发布时间】:2013-11-12 20:31:20 【问题描述】:我有一个带有按钮的视图控制器。当用户单击按钮时,我希望将用户导航到表视图控制器(即显示表视图)。
当按钮被点击时,我让它调用以下方法:
- (void)loadTableViewController
TableViewViewController *tableViewController = [[TableViewController alloc] initWithNibName:nil bundle:NULL];
[self.navigationController pushViewController:tableViewController animated:YES];
上面的代码似乎没问题,因为在最后一行之后的调试模式下,我被带到了 TableView 控制器的实现文件。这就是事情崩溃的地方......
我将tableView
声明为tableViewController
的属性
这里是 viewDidLoad 方法的代码:
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[self.view addSubview:self.tableView];
程序在调试模式的最后一行之后发生故障。完全不确定出了什么问题...我所做的唯一其他更改是为表格返回 1 节和 1 行。这是代码:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 1;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = @"Test";
return cell;
编辑:添加错误详细信息。
我得到的错误看起来像一个通用的“libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)"
请记住,我对 Xcode 和一般编程非常陌生。所以我可能没有在正确的地方寻找特定的错误。
【问题讨论】:
您需要比“崩溃”更多的细节。你得到了什么错误,你没有预料到什么行为? 是的,一些错误信息会有所帮助 【参考方案1】:您没有使用UITableViewController's
初始化方法。相反,使用
TableViewViewController *tableViewController = [[TableViewController alloc] initWithStyle:UITableViewStylePlain];
[self.navigationController pushViewController:tableViewController animated:YES];
在那之后,在 UITableViewController
类中初始化表格视图是没有意义的,因为 UITableViewController
已经为你做这件事(这就是使用它的目的),而是使用 self.tableView
访问 tableView
属性.
另请注意- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier
仅适用于 ios 6.0 及更高版本(低于该版本会崩溃)
对于填充单元格,只需使用:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row + 1];
return cell;
【讨论】:
所以,如果我理解正确,在单击按钮时调用的方法中,我将初始化更改为您提供的初始化。另外,我不再需要在 TableViewController 的 viewDidLoad 方法中进行初始化。是对的吗?所以我在那个方法中只有[super viewDidLoad];
我试过了,现在应用程序在单元格创建者方法中崩溃了。 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
行似乎有错误。错误是“以未捕获的异常终止”
我编辑了我的答案。如果您还有问题,请告诉我。
太棒了!太感谢了。不能给你投票,因为我缺乏声誉,但你介意解释一下细胞创建者出了什么问题吗?
我的荣幸。祝你接下来的事情好运! :)【参考方案2】:
我猜问题是由这一行引起的:
TableViewViewController *tableViewController = [[TableViewController alloc] initWithNibName:nil bundle:NULL];
您缺少实际的笔尖名称。将 nil 替换为您的 nib 名称。
【讨论】:
以上是关于如何从常规视图控制器推送表视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章