如何更改放置在原型单元格中的UIButton标题?
我有自定义类型的单元格的TableView。 在原型中,我有3个按钮。 我想在按下另一个按钮时可以更改按钮标题。 我试着这样做:
- (IBAction) doSomething:(id) sender {
CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.myTableView];
NSIndexPath *hitIndex = [self.myTableView indexPathForRowAtPoint:hitPoint];
NSLog(@"%ld", (long)hitIndex.row); //This works and I can see the row which button placed
MyCustomViewCell *cell = [_myTableView dequeueReusableCellWithidentifier:@"myCell"];
//I'm tried this:
cell.button.titleLabel.text = @"111";
//and I'm tried this:
[cell.button setTitle:@"222" forState:UIControlStateNormal];
}
我做错了什么?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath(NSIndexPath *)indexPath {
MyCustomViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if (!cell) {
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
cell.accessoryType= UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = _productNameForClearance;
cell.imageView.image = _productImageForBasket;
return cell;
}
你的代码不起作用的原因是这段代码给你一个完全不相关的单元格:
MyCustomViewCell *cell = [_myTableView dequeueReusableCellWithidentifier:@"myCell"];
它有正确的类,所以你可以修改它没有错误,但它不是在你的UITableView
可见的单元格。
但是,您应该拥有一些非UI状态,可以告诉您显示的是什么标题:否则,将新标题从屏幕上滚动出来,然后重新打开旧标题,这是错误的。
要做正确的事情,你需要在两个地方实现这个变化:首先, doSomething
代码应该修改负责修改标题的模型状态,如下所示:
// This needs to be part of your model
NSMutableSet *rowsWithChangedTitle = ...
- (IBAction) doSomething:(id) sender {
CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.myTableView];
NSIndexPath *hitIndex = [self.myTableView indexPathForRowAtPoint:hitPoint];
NSLog(@"%ld", (long)hitIndex.row); //This works and I can see the row which button placed
[myModel.rowsWithChangedTitle addObject:@(hitIndex.row) ];
[self.myTableView reloadData];
}
然后,你需要改变你的tableView:cellForRowAtIndexPath:
方法是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomViewCell *cell = [_myTableView dequeueReusableCellWithidentifier:@"myCell"];
...
if ([myModel.rowsWithChangedTitle containsObject:@(indexPath.row)]) {
cell.button.titleLabel.text = @"111";
[cell.button setTitle:@"222" forState:UIControlStateNormal];
}
...
}
向单元格中的按钮添加提供触摸事件的操作处理程序。 喜欢这个:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* reuseIdentifier = [self cellReuseIdentifierForIndexPath:indexPath];
MyCustomCell* cell = (MyCustomCell*)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
[cell.button addTarget:self action:@selector(cellButtonAction:forEvent:) forControlEvents:UIControlEventTouchUpInside];
// your implementation
}
这里是cellButtonAction:forEvent:
实现:
- (IBAction)cellButtonAction:(id)sender forEvent:(id)event
{
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
// your code here
MyCustomCell* cell = [self.tableView cellForRowAtIndexPath: indexPath];
[cell.button setTitle:@"222" forState:UIControlStateNormal];
}
希望这可以帮助。
替换行:
MyCustomViewCell *cell = [_myTableView dequeueReusableCellWithidentifier:@"myCell"];
有:
MyCustomViewCell *cell = [_myTableView cellForRowAtIndexPath: hitIndex]
当您按下按钮时,标题被更改,但当您滚动并且标题已更改的行消失时,单元格将被循环使用,并且当您向后滚动时,单元格将从循环池中取出并设置为初始值。 我的建议是创建数组,以便跟踪更改的行(标题),并在cellForRowAtIndexPath:方法中显示该数组中已更改的标题。
链接地址: http://www.djcxy.com/p/60503.html上一篇: How to change UIButton title which placed in prototype cell?