有效地自定义一个简单的 UITableViewCell
Customize a simple UITableViewCell efficiently
我想自定义一个简单的 UITableViewCell 以便我 运行 自定义 仅一次 并添加值(例如, 单元格标题)稍后。我的应用程序的单元格更复杂——它有子视图并使用自动布局;但是,我相信一个简单的例子将有助于关注 objective.
我正在使用 iOS 8、Xcode 6.X、Objective-C 和 Nibs(无故事板)以保持简单。我还没有为 UITableViewCell 创建自定义 class。相反,我有以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
//[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1; //FIXED VALUE FOR EXAMPLE'S SAKE
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3; //FIXED VALUE FOR EXAMPLE'S SAKE
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"tableView:cellForRowAtIndexPath:");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
NSLog(@"cell == nil");
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//CUSTOMIZING CELL THAT I WANT TO RUN ONLY ONCE
cell.backgroundColor = [UIColor redColor];
}
NSArray *numbersArray = @[@1,@2,@3];
cell.textLabel.text = [NSString stringWithFormat:@"%@", numbersArray[indexPath.row]];
return cell;
}
输出:
tableView:cellForRowAtIndexPath:
cell == nil
tableView:cellForRowAtIndexPath:
cell == nil
tableView:cellForRowAtIndexPath:
cell == nil
第一个问题: 为什么 cell == nil
运行 是 3 次? 运行自定义代码cell.backgroundColor = [UIColor redColor];
3次好像很浪费
现在,当我启用时:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
并使用:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
而不是:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
我得到输出:
tableView:cellForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
第二个问题: 为什么根本就没有 cell == nil
运行?
最后的问题: 我怎样才能使 cell == nil
运行 只有一次,以便我只格式化 UITableViewCell 一次?有没有更好的方法来自定义一个简单的单元格,运行只需一次自定义代码?
Why is cell == nil run 3 times? It seems wasteful to run the customization code cell.backgroundColor = [UIColor redColor]; 3 times.
table 视图很可能一次显示三个单元格,因此需要三个不同的单元格对象。
Why isn't cell == nil run at all?
文档指出,如果您之前注册了标识符,-dequeueReusableCellWithIdentifier:forIndexPath:
总是 returns 一个有效的单元格。它主要负责检查您是否需要一个新单元格。
How can I make cell == nil run only once so that I format the UITableViewCell only once?
你不知道。您将必须自定义每个实例。不过,我建议使用自定义子类,而不是从外部弄乱 UITableViewCell
。
执行此操作的最佳方法是为您的单元格创建自定义 class,并进行任何不依赖于那里的 indexPath 的自定义。通常,我在 initWithCoder
或 awakeFromNib
中执行此操作。您应该在 viewDidLoad
中注册笔尖;我认为您在对 Christian 的回答的评论中提到的代码没有任何问题,除非文件名有误。添加子视图或自定义您的单元格真的不是视图控制器的事;该代码属于单元格的 class.
顺便说一句,这不会多次保留 运行ning 中的自定义代码。它需要为您创建的每个单元格实例 运行 一次,就像在您的原始代码中一样。创建的单元格数量将等于一次适合屏幕的数量(可能加一)。
我想自定义一个简单的 UITableViewCell 以便我 运行 自定义 仅一次 并添加值(例如, 单元格标题)稍后。我的应用程序的单元格更复杂——它有子视图并使用自动布局;但是,我相信一个简单的例子将有助于关注 objective.
我正在使用 iOS 8、Xcode 6.X、Objective-C 和 Nibs(无故事板)以保持简单。我还没有为 UITableViewCell 创建自定义 class。相反,我有以下代码:
- (void)viewDidLoad {
[super viewDidLoad];
//[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1; //FIXED VALUE FOR EXAMPLE'S SAKE
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3; //FIXED VALUE FOR EXAMPLE'S SAKE
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"tableView:cellForRowAtIndexPath:");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
NSLog(@"cell == nil");
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//CUSTOMIZING CELL THAT I WANT TO RUN ONLY ONCE
cell.backgroundColor = [UIColor redColor];
}
NSArray *numbersArray = @[@1,@2,@3];
cell.textLabel.text = [NSString stringWithFormat:@"%@", numbersArray[indexPath.row]];
return cell;
}
输出:
tableView:cellForRowAtIndexPath:
cell == nil
tableView:cellForRowAtIndexPath:
cell == nil
tableView:cellForRowAtIndexPath:
cell == nil
第一个问题: 为什么 cell == nil
运行 是 3 次? 运行自定义代码cell.backgroundColor = [UIColor redColor];
3次好像很浪费
现在,当我启用时:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
并使用:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
而不是:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
我得到输出:
tableView:cellForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
tableView:cellForRowAtIndexPath:
第二个问题: 为什么根本就没有 cell == nil
运行?
最后的问题: 我怎样才能使 cell == nil
运行 只有一次,以便我只格式化 UITableViewCell 一次?有没有更好的方法来自定义一个简单的单元格,运行只需一次自定义代码?
Why is cell == nil run 3 times? It seems wasteful to run the customization code cell.backgroundColor = [UIColor redColor]; 3 times.
table 视图很可能一次显示三个单元格,因此需要三个不同的单元格对象。
Why isn't cell == nil run at all?
文档指出,如果您之前注册了标识符,-dequeueReusableCellWithIdentifier:forIndexPath:
总是 returns 一个有效的单元格。它主要负责检查您是否需要一个新单元格。
How can I make cell == nil run only once so that I format the UITableViewCell only once?
你不知道。您将必须自定义每个实例。不过,我建议使用自定义子类,而不是从外部弄乱 UITableViewCell
。
执行此操作的最佳方法是为您的单元格创建自定义 class,并进行任何不依赖于那里的 indexPath 的自定义。通常,我在 initWithCoder
或 awakeFromNib
中执行此操作。您应该在 viewDidLoad
中注册笔尖;我认为您在对 Christian 的回答的评论中提到的代码没有任何问题,除非文件名有误。添加子视图或自定义您的单元格真的不是视图控制器的事;该代码属于单元格的 class.
顺便说一句,这不会多次保留 运行ning 中的自定义代码。它需要为您创建的每个单元格实例 运行 一次,就像在您的原始代码中一样。创建的单元格数量将等于一次适合屏幕的数量(可能加一)。