如何从常规视图控制器推送表视图控制器?

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 名称。

【讨论】:

以上是关于如何从常规视图控制器推送表视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

从表视图(子视图)推送新的视图控制器

无法从 appdelegate 推送视图控制器

我应该将底部工作表作为子视图添加到当前视图控制器还是推送添加了子视图的 UIWindow?

从嵌入在 UIScrollView 中的表中推送视图控制器

如何将数据从表视图传递到另一个视图控制器

如何将标签中的数据从表视图行操作发送到视图控制器?