使用 Objective-C iOS 以编程方式创建 TableVIew
Posted
技术标签:
【中文标题】使用 Objective-C iOS 以编程方式创建 TableVIew【英文标题】:Creating A TableVIew Programmatically With Objective-C iOS 【发布时间】:2012-04-03 23:41:19 【问题描述】:我是开发 ios 应用程序和 Objective C 本身的新手,所以我有一个可能非常简单的问题。
目前我有以下从工具栏按钮单击调用的方法。该方法旨在在框架变量fr中创建表格视图。
- (IBAction)addGolfer:(id)sender
CGRect fr = CGRectMake(101, 45, 100, 416);
UITableView *tabrleView = [[UITableView alloc]
initWithFrame:fr
style:UITableViewStylePlain];
tabrleView.autoresizingMask =
UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleWidth;
tabrleView.delegate = self;
tabrleView.dataSource = self;
[tabrleView reloadData];
self.view = tableView;
调用这个方法的结果不是我所期望的。表格视图不是在框架“fr”中创建表格视图,而是填满整个屏幕。
再次,我是全新的,如果有任何答案和建议,我将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:当您为UITableView
设置dataSource
和delegate
属性时,这意味着您必须至少为dataSource
编写以下方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
如果你不这样做,它就会崩溃。总结你会得到这个(这段代码可能包含语法或逻辑错误 - 我用记事本写的):
@interface YourViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
UITableView *firstTableView;
UITableView *secondTableView;
@end
//
@implementation YourViewController
#pragma mark - Objects Processing
- (void)addGolfer:(UIBarButtonItem *)sender
if (secondTableView)
[secondTableView removeFromSuperView];
secondTableView = nil;
secondTableView = [[UITableView alloc] initWithFrame:CGRectMake(101, 45, 100, 416)];
secondTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
secondTableView.delegate = self;
tabrleView.dataSource = self;
[self.view addSubview:secondTableView];
#pragma mark - TableView DataSource Implementation
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (tableView == firstTableView) // your tableView you had before
return 20; // or other number, that you want
else if (tableView == secondTableView)
return 15; // or other number, that you want
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.backgroundView = [[UIView alloc] init];
[cell.backgroundView setBackgroundColor:[UIColor clearColor]];
[[[cell contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
if (tableView == firstTableView) // your tableView you had before
// ...
else if (tableView == secondTableView)
cell.titleLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row + 1];
return cell;
@end
【讨论】:
【参考方案2】:第一步:添加代理UITableViewDataSource,UITableViewDelegate
@interface viewController: UIViewController<UITableViewDataSource,UITableViewDelegate>
UITableView *tableView;
第 2 步:
-(void)viewDidLoad
tableView=[[UITableView alloc]init];
tableView.frame = CGRectMake(10,30,320,400);
tableView.dataSource=self;
tableView.delegate=self;
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[tableView reloadData];
[self.view addSubview:tableView];
第 3 步: 表格视图的属性(行和列)
//-- 表中的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 10;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
//-- 表头高度(如果需要)
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return 50;
//--将数据分配给单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.text=[your_array objectAtIndex:indexPath.row]; ***(or)*** cell.textLabel.text = @"Hello";
return cell;
//-- 触摸单元格时的操作
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
// Your custom operation
【讨论】:
【参考方案3】:不设置UIViewController
的视图,而是将tableView添加为子视图。
代替:
self.view = tableView;
这样做:
[self.view addSubview:tableView];
这将正确地尊重您设置的框架。
【讨论】:
我这样做了,但现在什么也没有发生。 --- 抱歉,我现在收到错误消息。 可能是你拼错了tabrleView
。到处都应该是tableView
。
是的,我这样做是因为我有另一个 TableView
@DHamrick 是对的。删除您分配给视图的任何行。对于您正在使用的任何表格,无论拼写如何,请执行 [self.view addSubview:...];您可能还会在 autoresizingMask 上绊倒。通过注释掉它首先让它工作。
*** 断言失败 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061 2012-04-03 20:02:44.415 Dot Golf Scoring [728:f803] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UITableView 数据源必须从 tableView:cellForRowAtIndexPath: 返回一个单元格:”以上是关于使用 Objective-C iOS 以编程方式创建 TableVIew的主要内容,如果未能解决你的问题,请参考以下文章
IOS / Objective-C:以编程方式在按钮下的中心线
在 Objective-C iOS 5 中为 Retina Display 以编程方式更改资源