将 UITableView 添加到现有 ViewController
Add a UITableView to an existing ViewController
我正在尝试以编程方式将 UITableView
添加到现有的 UIViewController
。
我的 run.h
文件有这个:
@interface runTests : UIViewController <UINavigationControllerDelegate,UITextFieldDelegate,UIAlertViewDelegate,UITableViewDelegate,UITableViewDataSource> {NSTimer *Timer;}
@property (strong, nonatomic) UITableView *tableView;
我的应用程序通过了速度测试,在测试结束时,我试图将 TableView 添加到视图中。目前我有这个:
-(void)addSpeedTable {
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.tableView.rowHeight = 45;
self.tableView.sectionFooterHeight = 22;
self.tableView.sectionHeaderHeight = 22;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
}
- (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 = @"newCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"Testing";
return cell;
}
该应用从未进入 cellForRowAtIndexPath
方法,但确实进入了上面的其他两个方法。我在 Xcode 输出中看不到任何错误。
我需要在这里做的任何事情:
当应用程序失败时,我得到的是:
您需要将 属性 tableView
分配给您在 addSpeedTable
方法中创建的实例,然后使用 self.tableView
.
引用它
-(void)addSpeedTable {
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.tableView.rowHeight = 45;
self.tableView.sectionFooterHeight = 22;
self.tableView.sectionHeaderHeight = 22;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
}
编辑
正如其他答案所指出的,您可能还需要在 UITableView
上设置框架:
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
您应该使用框架(以及可选的样式)初始化您的 UITableView,或者至少在某处定义框架。
例如:
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) style:UITableViewStylePlain];
如果 UITableView
的宽度为零,它永远不会调用 datasource
所以像这样更改您的代码
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
祝你好运!
您使用init方法来初始化视图,这意味着视图的框架是CGRectZero。
因此调用了 numberOfRowsInSection 但 SDK 发现不需要显示单元格,因为框架是 CGRectZero。
-(void)addSpeedTable {
.....
tableView.frame = self.view.bounds;
[self.view addSubview:tableView];
}
此外,您应该通过 self.tableView = tableView 将 tableView 分配给 属性,否则您的 tableView 属性 将永远不会处于有效状态。
你可以在thirdLine加断点,打印出frame,看看它的bounds有没有为0。
我认为您可能声明了错误的语法。我无法上传图片,所以请注意下面代码的区别。大写可能是问题所在。
{
// 服务条款
静态 NSString * cellId = @"justCommon";
static NSString *CellIdentifier = @"newCell";
}
我正在尝试以编程方式将 UITableView
添加到现有的 UIViewController
。
我的 run.h
文件有这个:
@interface runTests : UIViewController <UINavigationControllerDelegate,UITextFieldDelegate,UIAlertViewDelegate,UITableViewDelegate,UITableViewDataSource> {NSTimer *Timer;}
@property (strong, nonatomic) UITableView *tableView;
我的应用程序通过了速度测试,在测试结束时,我试图将 TableView 添加到视图中。目前我有这个:
-(void)addSpeedTable {
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.tableView.rowHeight = 45;
self.tableView.sectionFooterHeight = 22;
self.tableView.sectionHeaderHeight = 22;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
}
- (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 = @"newCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"Testing";
return cell;
}
该应用从未进入 cellForRowAtIndexPath
方法,但确实进入了上面的其他两个方法。我在 Xcode 输出中看不到任何错误。
我需要在这里做的任何事情:
当应用程序失败时,我得到的是:
您需要将 属性 tableView
分配给您在 addSpeedTable
方法中创建的实例,然后使用 self.tableView
.
-(void)addSpeedTable {
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.tableView.rowHeight = 45;
self.tableView.sectionFooterHeight = 22;
self.tableView.sectionHeaderHeight = 22;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
}
编辑
正如其他答案所指出的,您可能还需要在 UITableView
上设置框架:
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
您应该使用框架(以及可选的样式)初始化您的 UITableView,或者至少在某处定义框架。
例如:
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) style:UITableViewStylePlain];
如果 UITableView
的宽度为零,它永远不会调用 datasource
所以像这样更改您的代码
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
祝你好运!
您使用init方法来初始化视图,这意味着视图的框架是CGRectZero。 因此调用了 numberOfRowsInSection 但 SDK 发现不需要显示单元格,因为框架是 CGRectZero。
-(void)addSpeedTable {
.....
tableView.frame = self.view.bounds;
[self.view addSubview:tableView];
}
此外,您应该通过 self.tableView = tableView 将 tableView 分配给 属性,否则您的 tableView 属性 将永远不会处于有效状态。
你可以在thirdLine加断点,打印出frame,看看它的bounds有没有为0。
我认为您可能声明了错误的语法。我无法上传图片,所以请注意下面代码的区别。大写可能是问题所在。 { // 服务条款 静态 NSString * cellId = @"justCommon";
static NSString *CellIdentifier = @"newCell";
}