#objective-c #ios #uitableview #checkmark #accessorytype
#objective-c #iOS #uitableview #установите флажок #тип доступа
Вопрос:
Я очень новичок в программировании на iPhone, поэтому моя проблема может быть вызвана полным незнанием самых базовых принципов.
Я разрабатываю приложение для iPhone, которое имеет два представления. В первом представлении есть две кнопки, при нажатии одной из кнопок появляется всплывающее окно modalview с tableview. Это табличное представление заполняется по-разному в зависимости от того, какая кнопка нажата. Если нажата кнопка button1, tableview заполняется данными button1. Пользователь может выбирать ячейки, и если это сделано, для типа доступа к ячейкам устанавливается значение UITableViewCellAccessoryCheckmark. Затем я сохраняю имя проверенных ячеек в tableViewListChecked, чтобы позже можно было решить, какая ячейка должна проверяться при изменении данных.
Проблема заключается в следующем: после того, как modalview отклоняется, и я выбираю button2, ячейки, которые были выбраны в button1Data, все еще выбираются в button2Data. Мне ясно, что функция [theTableView reloadData] работает, поскольку данные меняются, однако уровни доступа остаются прежними, пока я не прокручиваю ячейки с экранов.
PS. Если я действительно прокручиваю ячейки экрана, там accessorytype установлен правильно.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
}
else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cell.textLabel.text = [tableViewList objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (![tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[tableViewListChecked addObject:[NSString stringWithString:cell.textLabel.text]];
}
else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
cell.accessoryType = UITableViewCellAccessoryNone;
[tableViewListChecked removeObject:[NSString stringWithString:cell.textLabel.text]];
}
}
Спасибо за помощь!
Ответ №1:
Если ячейка не равна нулю (если она была удалена из очереди из табличного представления), то вы на самом деле, как есть, не меняете тип принадлежности. Отбросьте остальное, т.Е. Измените
else if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
Для
if ([tableViewListChecked containsObject:[NSString stringWithString:cell.textLabel.text]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
Комментарии:
1. Спасибо за ответ, однако приложение вылетает, если я это сделаю. Вот вывод на консоль pastie.org/2677067 возможно, вы смогли бы разобраться в этом, но я не так долго занимаюсь своим «обучением».
2. Вероятно, потому, что у вас есть [NSString stringWithString:cell.textLabel.text], где cell.textLabel.text равно нулю, что вызывает исключение.
3. ТАмазинг, я переместил оператор if ниже точки, в которой я установил cell.text. На данный момент он отлично работает. Спасибо, вы только что спасли мой день.
Ответ №2:
Похоже, вы повторно используете один и тот же экземпляр UITableView
каждый раз, когда представляете модальное представление, и в этом случае, что происходит с tableViewListChecked
массивом? Вы заменяете данные в tableViewList
; но используете ли вы какую-либо стратегию для сохранения списка отмеченных элементов между нажатиями на button1 и button2?
Комментарии:
1. массив tableViewListChecked выделяется мной, поэтому, насколько я понимаю, он не удаляется до завершения работы программы. Массив не нужно сохранять после выхода, поэтому я просто не выпускаю его. Это моя стратегия, она может быть не идеальной, но пока она отлично работает. Спасибо за ваш ответ.
Ответ №3:
Если ребята здесь вам не помогли, вы можете просто установить: cell.accessoryType = UITableViewCellAccessoryNone каждый раз, когда пользователь нажимает на button2
Комментарии:
1. Мне нравится ваше мышление, однако я не знаю, как установить для всех ячеек accesorrytype значение none из другого veiw. Не могли бы вы мне это объяснить? Спасибо за ваш ответ.
2. Хм .. не проверял мою идею, но я думаю, что вы можете определить значение bool и установить для него значение NO в viewDidLoad. затем, когда пользователь нажимает на button2, установите для этого bool значение YES и сохраните его в UserDefaults (если вы не знаете, как я покажу код), затем, когда появится другое представление, проверьте этот bool из памяти и в вашем методе cellForRowAtIndexPath проверьте этот bool и установите свои ячейки.. как я упоминал ранее
3. это может быть решением, однако я не буду его тестировать, поскольку jBat уже дал мне отличный ответ, который позволит мне сохранить весь код в контроллере модального представления 🙂 Но еще раз спасибо