TableView 不会在 UINavigationController 内加载

Posted

技术标签:

【中文标题】TableView 不会在 UINavigationController 内加载【英文标题】:TableView wont load inside of UINavigationController 【发布时间】:2011-05-22 13:16:25 【问题描述】:

我在将数据加载到 UITableView 时遇到问题。

我的实现如下:

@interface FirstViewController : UINavigationController <UIActionSheetDelegate, UITableViewDelegate> 

    UITableViewController *tableViewController;        
    UITableView *table;    
   
@end

viewDidLoad方法是:

- (void)viewDidLoad     
    [super viewDidLoad]; 
    tableViewController = [[UITableViewController alloc] init];
    table = [[UITableView alloc] init];
    tableViewController.tableView = table;
    [tableViewController.tableView setDelegate:self];

    self.newsList = [NSMutableArray array];
    tableViewController.tableView.rowHeight = 130.0;

    [self addObserver:self forKeyPath:@"newsList" options:0 context:NULL];    
    [self pushViewController:tableViewController animated:NO];


我不明白出了什么问题。可能是因为我正在添加观察者而无法加载数据?

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context

    [tableViewController.tableView reloadData];

感谢您的建议!

【问题讨论】:

我们可能需要更多关于您从哪里调用它的详细信息,但我认为从视图尚不可见的导航控制器调用-pushViewController:animated: 存在问题。 (viewDidLoad 发生在视图可见之前)。 这个表单是从 UITabBarController 调用的。我已将其分配给 TabView 之一 【参考方案1】:

因此,如果我理解正确,您有一个标签栏控制器,其中包含导航控制器作为标签之一,导航控制器在其 viewDidLoad 方法中创建一个表视图控制器,并立即推送它。

viewDidLoad 是执行加载(您已执行)的好时机,也是执行行为(例如推送视图)的坏时机。

您可以尝试将 pushViewController 部分移至 -viewDidAppear:animated:。这应该为您提供表格视图,但它的行为仍然会有些有趣,因为您将有一个后退按钮,该按钮会导致表格消失,然后立即再次按下。

解决此问题的最佳方法是将表视图控制器设置为导航控制器的根视图控制器。

更新:

似乎这里的控制器应该做什么有点模糊。

标签栏控制器:

不要子类化它,将导航视图控制器作为选项卡之一。我想你已经猜对了。

导航控制器

不要子类化它,用你的表视图控制器作为根视图控制器来初始化它。除非你试图让导航控制器做一些与它通常做的完全不同的事情,否则很少需要对它进行子类化。

表格视图控制器

子类化。它为您完成了 90% 的开销工作,您所要做的就是为数据源和委托方法编写实现。

起初这可能看起来很有趣,因为您需要以相反的顺序初始化它们。您的应用程序委托应该初始化表视图控制器,然后使用表视图控制器作为根初始化导航控制器,然后使用导航控制器作为选项卡之一初始化选项卡栏控制器。这是一个棘手的控制器堆栈,一开始要做好。

【讨论】:

所以你的意思是我必须在 viewDidLoad 中调用 [self initWithRootViewController:tableViewController] ? 最初 FirstViewController 是 UITableViewController 的孩子,它工作得很好,但是在我把它作为 UINavigationController 的孩子之后,数据加载已经坏了。 如何在 TableViewController 子类中将 UINavigationController 设置为 root ? @Konoplianko 你应该避免这样做。导航控制器拥有根视图,根视图不拥有导航控制器。如果你不遵循这一点,你很容易得到循环引用、泄漏、崩溃。 对不起,我不明白。 “拥有”是什么意思?【参考方案2】:

你可能忘记了一件小事,dataSource

[tableViewController.tableView setDataSource:self];

setDelegate: 方法之后添加这个。

【讨论】:

谢谢!我浪费了很多时间来寻找这有什么问题。它终于奏效了!希望我能给你买杯啤酒:)

以上是关于TableView 不会在 UINavigationController 内加载的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift Observeable 不会在数据更改时更新 tableview

选择行后Tableview不会重新加载数据

TableView 不会在 UINavigationController 内加载

除非我滚动,否则页脚不会显示在 TableView 上

CKAsset 不会显示在 tableview 图像中

tableView:cellForRowAtIndexPath: 永远不会被调用