如何更改放置在原型单元格中的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?

下一篇: Count number of values in dictionary object