如何在iOS中管理自定义单元格标签值?

时间:2015-02-27 14:26:57

标签: ios objective-c uitableview ibaction tableviewcell

我正在使用storyboards构建一个iOS应用程序。我使用了UITableViewController,它有6个自定义单元格,每个单元格包含三个IBOutlet按钮和一个IBOutlet标签。

当用户点击某个特定自定义单元格中的任何按钮时,只应更改该特定单元格标签的值。

但结果是,每个自定义单元格中所有标签的值都会发生变化。

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *Cellidentifier1 = @"List";
    Cell *cell1 = [tableView dequeueReusableCellWithIdentifier:Cellidentifier1 forIndexPath:indexPath];
     cell1.selectionStyle = UITableViewCellSelectionStyleNone;
    // Configure the cell...

    long row = [indexPath row];

    cell1.First.tag=row;//button iboutlet in cell
    cell1.Second.tag=row;//button iboutlet in cell
    cell1.Third.tag=row;//button iboutlet in cell

    cell1.Level.tag=row;

    cell1.Level.text=Skill;//label iboutlet in cell

    return cell1;
 }


-(IBAction)FirstAction:(id)sender{

     Skill=@"first";
     [self.tableView reloadData];

}

-(IBAction)SecondAction:(id)sender{

     Skill=@"Second";
     [self.tableView reloadData];

}


-(IBAction)ThirdAction:(id)sender{

     Skill=@"Third";
     [self.tableView reloadData];

}

5 个答案:

答案 0 :(得分:3)

有几个问题:

  1. 您应该有一个反映表格视图中的内容的模型。具体来说,现在您只有一个Skill值,但您有六行。您希望维护一个值为数组的模型,如:

    @property (nonatomic, strong) NSMutableArray *values;
    

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.values = [@[@"first", @"first", @"first", @"first", @"first", @"first"] mutableCopy];
    }
    

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static NSString *Cellidentifier1 = @"List";
        Cell *cell = [tableView dequeueReusableCellWithIdentifier:Cellidentifier1 forIndexPath:indexPath];
    
        NSString *value = self.values[indexPath.row];
    
        cell.level.text = value;
    
        return cell;
    }
    

    注意,不需要标签号。

  2. 点击按钮时,您必须(a)识别表格中对应的行; (b)更新模型中的那一行; (c)重新加载表格中的那一行(将查找模型中的值):

    - (void)updateCell:(UIView *)cell withValue:(NSString *)value {
        NSParameterAssert(cell);
    
        NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)cell];
        if (cell) {
            self.values[indexPath.row] = value;
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }
    }
    
    - (IBAction)didTapFirstButton:(id)sender {
        [self updateCell:[[sender superview] superview] withValue:@"first"];
    }
    
    - (IBAction)didTapSecondButton:(id)sender{
        [self updateCell:[[sender superview] superview] withValue:@"second"];
    }
    
    - (IBAction)didTapThirdButton:(id)sender{
        [self updateCell:[[sender superview] superview] withValue:@"third"];
    }
    

    注意,sender是按钮。所以我通过抓取superview(这是单元格的内容视图)获取表格视图单元格,然后抓住它的superview(单元格本身)。如果您的视图层次结构不同,则根据需要进行更改,但希望这说明了这个想法。

答案 1 :(得分:0)

首先,您必须在选择行时使用委托方法selectRowAtIndexPath,然后可以使用indexPath选择的行按钮...

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){

} 

当选择行时,将执行所需的行按钮功能

答案 2 :(得分:0)

尝试以下代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *Cellidentifier1 = @"List";
    Cell *cell1 = [tableView dequeueReusableCellWithIdentifier:Cellidentifier1 forIndexPath:indexPath];
     cell1.selectionStyle = UITableViewCellSelectionStyleNone;
    // Configure the cell...

    long row = [indexPath row];

    cell1.First.tag=row;//button iboutlet in cell
    cell1.Second.tag=row;//button iboutlet in cell
    cell1.Third.tag=row;//button iboutlet in cell

    cell1.Level.tag=row;

    cell1.Level.text=Skill;//label iboutlet in cell
[cell1.First addTarget:self action:@selector(FirstAction:) forControlEvents:UIControlEventTouchUpInside];
[cell1.Second addTarget:self action:@selector(SecondAction:) forControlEvents:UIControlEventTouchUpInside];
[cell1.Third addTarget:self action:@selector(ThirdAction:) forControlEvents:UIControlEventTouchUpInside];

    return cell1;
 }

答案 3 :(得分:0)

有几种方法可以做到这一点。但是,通过查看代码,我将确保从您选择的单元格中获取正确的indexPath。假设您已经设置了目标操作,您可以像这样重写IBAction方法:

-(IBAction)firstAction:(UIButton *)sender{
    int row = sender.tag;
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:row inSection:0];
    Cell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    Skill = @"first";
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

这将获得正确的单元格和索引路径。仅更新该单元格的标签,然后重新加载。

答案 4 :(得分:0)

在您的IBOutlet方法中添加此内容以查找行

的indexPath
CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint];

而不是重新加载整个tableview,您只想在指定的indexPath

重新加载该单元格的文本

要重新加载一个单元格,请执行而不是 [self.tableView reloadData];

[self.tableView reloadRowsAtIndexPaths:@[hitIndex] withRowAnimation:UITableViewRowAnimationNone];