普通视图控制器内的表格视图

Posted

技术标签:

【中文标题】普通视图控制器内的表格视图【英文标题】:Table view inside a normal view controller 【发布时间】:2012-07-22 18:57:37 【问题描述】:

我正在做这个 iPhone 项目,我需要在普通视图控制器内有一个(动态)表视图。我没有选择 Table View Controller,因为我需要在页面中放置其他东西。想象一个包含文本字段、按钮和大约 4-5 个单元格的小表格视图的页面。

当我运行应用程序时,我需要触摸一个按钮来切换到该视图。我单击按钮,应用程序崩溃并告诉我:

2012-07-22 14:40:57.304 多少?[3055:f803] * 断言失败 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061

这是我的 .H 文件:

#import <UIKit/UIKit.h>

@interface ProjectViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

这是我的 .M 文件:

#import "ProjectViewController.h"

@interface ProjectViewController ()

@end

@implementation ProjectViewController


//MyViewController.m
#pragma mark - Table View Data Source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    NSLog(@"numberOfSectionsInTableView");
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    NSLog(@"numberOfRowsInSection");
    return 5;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    NSLog(@"cellForRowAtIndexPath");

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    NSLog(@"cellForRowAtIndexPath");

    cell.textLabel.text = @"Test";

    return cell;



@end

我从表格视图控制拖动到我的控制器来设置委托和数据源。

我做错了什么??

感谢您的帮助。

【问题讨论】:

你能给我们看看.h文件吗? @interface ProjectViewController:UIViewController。是这样的吗? 我不确定你的问题。我的 .H 文件的完整代码在我的问题中。我想在里面放点别的东西吗? 你有tableview的出口吗? @luyuan,只要他没有在代码中引用它(例如:调用 -reloadData 等),这不是必需的。 @RaymondWang Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] 似乎告诉我们原型单元格不存在。请检查我的答案下的 cmets。通过设置一个插座并将其连接到情节提要中的 tableview 解决了这个问题:) 【参考方案1】:

尝试在您的.h 文件中创建一个插座并将其连接到您的storyboard 中的tableView

ProjectViewController.h

@property (nonatomic, strong) IBOutlet UITableView *myTableView;

ProjectViewController.m

@synthesize myTableView;

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    NSLog(@"cellForRowAtIndexPath");

    UITableViewCell *cell = [self.myTableView dequeueReusableCellWithIdentifier:@"cell"];

    NSLog(@"cellForRowAtIndexPath");

cell.textLabel.text = @"Test";

return cell;

【讨论】:

现在,这是我的一个愚蠢的错误!我要为我的表格视图创建一个出口。那么现在它工作得很好:) 谢谢你。对于那些有同样问题的人:在你的 .H 文件中添加以下内容:@property (weak, nonatomic) IBOutlet UITableView *tableView; 我编辑的太多,所以我的答案重新出现在您的评论下!无论如何感谢您的帮助,晚安! 你用过ARC吗?如果没有,你可以拥有这个:@property (nonatomic, retain) IBOutlet UITableView *myTableView; @AnthonyGuay 也许你没有使用 ARC @AnthonyGuay 如果 luyuan 帮助了你,那么请点击他们答案旁边的复选标记来接受答案,以便他们获得荣誉,这是你感谢他们的方式。欢迎来到 SO(堆栈溢出)!【参考方案2】:

在你的 -cellForRowAtIndexPath 中,如果你这样做,你会没事的。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
NSLog(@"cellForRowAtIndexPath");

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

if(cell == nil)

    cell = [[UITableViewCell alloc] 
             initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:@"cell"];


NSLog(@"cellForRowAtIndexPath");

cell.textLabel.text = @"Test";

return cell;

问题是您的单元从未分配和初始化内存。这就是您收到错误的原因。

【讨论】:

以上是关于普通视图控制器内的表格视图的主要内容,如果未能解决你的问题,请参考以下文章

弹出框控制器的固定子视图,里面有一个表视图

表格单元格内的滚动视图内的自定义视图未响应事件

如何填充表格视图,而不是表格视图控制器?

单元格未填充在表格内的第二个集合视图中

从导航控制器内的表视图控制器中的按钮展开

uitableViewcell 内的 UIPickerView