如何更改放置在原型单元格中的UIButton标题?

时间:2013-11-25 15:32:01

标签: ios objective-c uitableview uibutton

我有自定义类型的单元格TableView。在原型cell中,我有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;
}

3 个答案:

答案 0 :(得分:0)

添加动作处理程序,为单元格中的按钮提供触摸事件。 像这样:

- (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];
}

希望这有帮助。

答案 1 :(得分:0)

替换行:

MyCustomViewCell *cell = [_myTableView dequeueReusableCellWithidentifier:@"myCell"];

使用:

MyCustomViewCell *cell = [_myTableView cellForRowAtIndexPath: hitIndex]

当您按下按钮时,标题会被更改,但是当您滚动并且具有更改标题的行消失时,单元格将被回收,当您向后滚动时,单元格将从循环池中获取并设置为初始值。 我的建议是创建用于跟踪已更改行(标题)的数组,并在cellForRowAtIndexPath:方法中显示该数组中已更改的标题。

答案 2 :(得分:0)

您的代码不起作用的原因是此代码为您提供了一个完全不相关的单元格:

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];
    }
    ...
}