3

解决方案:

解决方案是首先正确地从 UITableView 开始,然后将 UITableView 委托添加到 UIViewController,如所选答案中所述。

前言:我几乎阅读了所有关于此事的文章,但没有任何建议有帮助。

我将 UITableViewController 的 UITableView 嵌入到 UIViewController 中。

我知道除非渲染视图,否则不会调用任何内容,所以我渲染它,我可以使用 NSLog 来显示它命中了这些方法。

我尝试在 InterfaceBuilder 中制作一个 UITableViewController 并将我的子类设置为它的自定义类,它有效!但这不是我需要做的。这是我收集/完成的内容:

  • 我正在使用 InterfaceBuilder 来管理 UIViewController 但我正在以编程方式添加 UITableView
  • 委托和数据源都设置正确并且 self.tableView 不是 nil
  • 尽管记录有效,但从未调用 cellForRowAtIndexPath 并且呈现的 UITableView 为空白
  • 我将代表添加到我的控制器中,但没有改变任何东西

我在 UITableViewController 上设置了以下内容:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"%@", self.questions); // This outputs the questions array as not empty and works
    // As you can see I am also returning 1.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"%d", [self.questions count]); // This outputs 4 as it should
    return [self.questions count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // All we need to focus on is this NSLog which never outputs
    NSLog(@"Was called and array is, %@" self.questions);

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    return cell;
}

我尝试了多种方式设置视图:直接添加 UITableViewController,添加 UITableViewController 的 UITableView(这似乎是正确的方法),但没有任何效果。

也许在使用 InterfaceBuilder 时我忘记了一个重要步骤,或者我忘记了一些随机的事情。任何帮助,将不胜感激。谢谢!

** 更新 ** 这是我添加 UiTableViewController 或 UITavleView 的方法

GTTableViewController *tvc = [[GTTableViewController alloc] initWithStyle:UITableViewStylePlain];
// Either
[self.view addSubview:tvc.view];
// OR
[self.view addSubview:tvc.tableView];
// Just to make sure everything is still ok.. and I see the 2/3 TV methods fire.
[self.tableView reloadData];
4

4 回答 4

6

我不会尝试分析您的代码,而是向您展示一个简单的示例,如何以编程方式将表视图添加到不是UITableViewController. 希望这将帮助您自己解决问题。

在 .h 文件中:

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
}
@end

在 .m 文件中:

- (void) loadView
{
  CGRect mainViewFrame = CGRectMake(...);
  self.view = [[[UIView alloc] initWithFrame:mainViewFrame] autorelease];

  // You could make this even simpler if you set the table view as
  // your main view
  CGRect tableViewFrame = self.view.bounds;
  UITableView* tableView = [[[UITableView alloc] initWithFrame:tableViewFrame style:UITableViewStylePlain] autorelease];
  [self.view addSubview:tableView];

  tableView.delegate = self;
  tableView.dataSource = self;
}

差不多就是这样。没什么了不起的,但是通过这个简单的设置,UITableViewDataSource数据源方法应该可以愉快地触发,包括tableView:cellForRowAtIndexPath:. 至少他们在这里做...

我建议你举这个例子,让它在你的环境中工作。然后你慢慢地一步一步地把它改造成你想要的设计。在某些时候,事情会停止工作,然后你就会找到问题的根源。

于 2013-01-23T18:24:18.643 回答
1

封闭的 UIViewController 是 UITableViewController 的容器控制器。UIViewController 文档对此有一个部分:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW81

我有一个类似的情况,添加对方法“addChildViewController”的调用解决了这个问题:

[self addChildViewController:tvc];
于 2014-01-24T14:28:35.693 回答
0

tableView 的框架是什么?您可以使用 打印它NSLog(@"%@", NSStringFromCGRect(self.tableView.frame));。预感是0,0,0,0。

于 2013-01-23T17:48:47.643 回答
0

1 - 检查 numberOfRowsInSection 返回的内容。它是否返回值 > 0?(听起来很愚蠢,我也犯了这样的错误)

2 - 在您的 IB 中,检查表格视图单元格类型 - 它是静态的还是动态的?如果是静态的,它甚至不会查看您的代码。

3 - 你在适当的地方调用 reloaddata 吗?

4 - 在您的视图控制器头文件(或声明它的任何位置)中,您是否从委托 UITableViewDelegate 和 UITableViewDataSource 继承?

于 2013-01-23T17:49:13.987 回答