2013-11-25 1 views
4

У меня есть TableView с пользовательским типом ячеек. В прототипе я имею 3 кнопки. Я хочу, чтобы иметь возможность изменить название кнопки, когда я нажал на другой. Я пытаюсь это сделать:Как изменить название UIButton, которое помещено в ячейку прототипа?

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

}

+0

Если кнопка типа UIButton вы должны использовать [cell.button SETTITLE: @ «111» Форстата: UIControlStateNormal]; – Greg

+0

Вы использовали отладчик, чтобы убедиться, что ваш код получает правильную 'indexPath' для кнопки и что' cell' не 'nil'? – rmaddy

+0

Я написал выше: NSLog (@ "% ld", (long) hitIndex.row); // Это работает, и я вижу строку, в которую помещена кнопка – daleijn

ответ

0

Причины ваш код не работает, что этот код дает совершенно неродственную клетку:

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

Он имеет право класса, так что вы можете изменить его без ошибок, но это не клетка который отображается в вашем UITableView.

У вас должно быть какое-то не-пользовательское состояние, которое сообщает вам, какой заголовок отображать, хотя: в противном случае прокрутка ячейки с новым заголовком с экрана и обратно приведет к возврату старого названия, что было бы неправильно.

Для того, чтобы сделать то, что вы пытаетесь правильно достичь, необходимо осуществить изменения в двух местах: во-первых, 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]; 
    } 
    ... 
} 
+0

все гения просты, не так ли) – daleijn

+0

myModel не понятен. Я знаю, какая модель, но как мне это сделать в коде? –

+0

@dasblinkenlight - Можно ли изменить текст ярлыка без перезагрузки. –

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

Надеется, что это помогает.

+0

Это будет работать вначале, но как только вы прокрутите ячейку с экрана и снова включите, визуальный эффект исчезнет. – dasblinkenlight

+0

Да, вы также должны сохранить новое название кнопки для источника данных, потому что объекты ячейки повторно используются. Это означает, что после того, как ячейка исчезнет из tableView, ее содержимое может быть заменено содержимым, которое начинается в tableView: cellForRowAtIndexPath:. Поэтому в 'tableView: cellForRowAtIndexPath:' вы также должны добавить что-то вроде: '[cell.button setTitle: self.titlesDatasource [indexPath.row] forState: UIControlStateNormal];' – dosi

0

Заменить строки:

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

с:

MyCustomViewCell *cell = [_myTableView cellForRowAtIndexPath: hitIndex] 

При нажатии кнопки название изменяется, но при прокрутке и строка с измененным названием исчезают клетки возвращают и когда вы прокручиваете назад, ячейка берется из переработанного пула и настраивается с начальными значениями. Мой совет - создать массив, в котором вы будете отслеживать измененные строки (титры) и в методе cellForRowAtIndexPath: вы должны отобразить измененный заголовок из этого массива.

+0

Сначала это будет работать, но как только вы прокрутите ячейку с экрана и снова включите, визуальный эффект исчезнет. – dasblinkenlight

+0

Я считаю, что вы используете CGPoint hitPoint = [sender convertPoint: CGPointZero toView: self.myTableView]; Попробуйте заменить CGPointZero на какую-то точку с вашей кнопки (отправителя), например, UIButton * btn = (UIButton *) отправитель; btn.center; , – Greg

+0

Причина, по которой это не будет «прилипать» после прокрутки, заключается в том, что 'cellForRowAtIndexPath:' возвращает текущий визуал, который является временным объектом по дизайну Cocoa, из-за переработки клеток. Для того, чтобы изменение было постоянным, в «cellForRowAtIndexPath:» должен быть код, который выполняет правильные изменения в ячейке, основываясь на каком-то постоянном индикаторе, который OP не имеет на данный момент. Нет никакого способа заставить его работать без такого индикатора. – dasblinkenlight

Смежные вопросы