#ios #objective-c #uitableview #uibutton #uilabel
#iOS #objective-c #uitableview #uibutton #uilabel
Вопрос:
В каждой ячейке uitableview есть кнопка и uilabel, например, следующий код
ListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell.UIButton addTarget:self action:@selector(ButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
cell.UIButton.tag = indexPath.row;
cell.UILabel.text = @"0";
Я хочу, чтобы при нажатии на кнопку uilabel.text в той же ячейке, что и uibutton, добавлялся один, я нажимаю снова, uilabel.text добавлял еще один, что-то вроде vote.
- (IBAction)ButtonClicked:(UIButton *)sender
{
NSInteger selectedRow = sender.tag;
}
итак, как я могу изменить текст uilabel? Спасибо.
Комментарии:
1. Пожалуйста, прочитайте developer.apple.com/library/mac/documentation/Cocoa/Conceptual /… и переименуйте ваши переменные и методы соответствующим образом, чтобы нам было проще помочь вам решить вашу проблему.
2. @duci9y спасибо за ваше предложение.
Ответ №1:
- Почему вы жестко кодируете строку
@"0"
в качестве текста метки? Если ваша цель — отслеживать голоса, вам необходимо отслеживать текущий подсчет голосов в некоторой структуре данных. Затем вы настраиваете каждую ячейку на основе фактического значения из данных. Затем эти данные могут обновляться по мере нажатия кнопок. - Установка тега кнопки на
indexPath.row
вызовет множество проблем, если строки можно добавлять, удалять или перемещать. Есть гораздо лучший способ получить ячейку с помощью кнопки без необходимости возиться с тегами.
Далее предполагается, что в вашем классе есть NSMutableArray
ivar ( _votes
), который служит источником данных для подсчета голосов.
Теперь ваш cellForRowAtIndexPath
становится:
ListCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
[cell.UIButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
}
NSNumber *votes = _votes[indexPath.row];
cell.UILabel.text = [NSString stringWithFormat:@"%@", votes];
Действие вашей кнопки становится:
- (void)buttonClicked:(UIButton *)button {
CGPoint pointInTable = [button convertPoint:CGPointMake(5, 5) toView:self.tableView];
NSIndexPath *path = [self.table indexPathForRowAtPoint:pointInTable];
NSNumber *oldVote = _votes[path.row];
NSNumber *newVote = @([oldVote intValue] 1);
_votes[path.row] = newVote;
[self.tableView reloadRowsAtIndexPaths:@[ path ] withRowAnimation: UITableViewRowAnimationFade];
}
Комментарии:
1. спасибо, я обновил свой код и решил эту проблему.