#iphone #cocoa-touch #uitableview #uiimageview
#iPhone #cocoa-touch #uitableview #uiimageview
Вопрос:
Я новичок в форуме, и мне нужна помощь. У меня есть табличное представление, и я могу добавлять к нему ячейки с помощью разных кнопок на отдельной странице. Я хочу, чтобы каждая кнопка добавляла новую ячейку, но с другим изображением. Так, например. Кнопка 1 добавит ячейку, а изображение с именем @"button1.png"
кнопка два добавит ячейку с именем изображения @"button2.png"
и так далее. Но у меня возникли проблемы с добавлением изображения в ячейку. Я могу сделать это в cellForRow
, но не в методе кнопки. Кто-нибудь, пожалуйста, может мне помочь? Я пробовал это в кнопках:
Кнопка РЕДАКТИРОВАНИЯ, используемая для добавления ячейки и изображения:
- (IBAction)outlet1:(id)sender {
[cart.cells addObject:@"1"];
[cart.cell.imageView setImage:[UIImage imageNamed:@"paddle1.png"]];
}
cellForRow
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
//cell.imageView.image = [UIImage imageNamed:@"paddle1.png"];
[myTableView reloadRowsAtIndexPaths:indexPath.row
withRowAnimation:UITableViewRowAnimationNone];
cell.textLabel.text = [cells objectAtIndex:indexPath.row];
return cell;
}
Ответ №1:
Способ визуализации UITableView заключается в том, что он запрашивает ячейку для строки всякий раз, когда собирается отобразить эту строку, генерирует нужные пиксели, а затем забывает о ячейке. Поскольку большая часть структуры ячейки не меняется от строки к строке, существует возможность повторно использовать один и тот же объект cell для отображения нескольких строк и просто (например) изменить текст метки или изображение ImageView.
Следовательно, изменение ячейки после отображения строки не изменяет внешний вид строки. Вам нужно указать таблице повторно отобразить эту строку:
[myTable reloadRowsAtIndexPaths:indexPathArray withRowAnimation:foo];
Это приведет к тому, что ОС вызовет сообщение делегата источника данных TableView cellForRowAtIndexPath:
, которое затем должно создать и / или изменить ячейку, которая затем отображается.
Ячейки не являются строками. Ячейки — это объекты, используемые для отображения строк.
Комментарии:
1. итак, когда вызывается этот метод, он перезагружает строки таблицы и позволяет мне добавлять новые изображения в строки tableview? Кроме того, что я должен заменить foo ? Большое спасибо за ответ, Андрей! 🙂
2. Вызовите метод с indexPathArray, который включает индексные пути к строкам, которые вы хотите изменить. Что касается ‘foo’, выберите нужную анимацию строки, например UITableViewRowAnimationNone, если вы просто хотите, чтобы она немедленно перерисовывалась. Для получения дополнительной информации ознакомьтесь с документацией по этому сообщению.
3. хорошо, поэтому я помещаю это в cellForRow с помощью этого кода:
[myTableView reloadRowsAtIndexPaths:indexPath.row withRowAnimation:UITableViewRowAnimationNone];
и он по-прежнему не позволяет добавлять изображение. И если я добавлю более 1 ячейки, а затем попытаюсь перейти на страницу просмотра таблицы, приложение выйдет из строя. Здесь не могли бы вы, пожалуйста, прочитать мой код в моем вопросе, я исправлю это и покажу, что у меня есть сейчас. Большое спасибо за всю помощь!!4. этот первый параметр — это массив, который вам нужен
[myTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
, что может привести к сбою. Если вам нужно несколько строк, используйте другое сообщение инициализатора массива.5. привет, Эндрю, я ценю помощь, но это совсем не то, что я ищу, я думаю. Это заставляет мой табличный вид делать кучу странных вещей. Вы видели приложение Amazon для iphone / ipad? Я хочу то же самое, что и при добавлении чего-либо в корзину для его покупки. Я хочу, чтобы вместе с изображением продуктов отображалась ячейка. Не могли бы вы помочь мне с этим, пожалуйста? Большое спасибо!
Ответ №2:
Если я понимаю проблему, вы хотите, чтобы объект cart отображал свое изображение в ячейке таблицы. Если это так, то почему бы вам не добавить представление UIImage к объекту cart. В соответствующее время (где-то, где объект выбирается пользователем) сохраните изображение элемента в своем представлении UIImage объекта. Затем, когда вы переходите к установке объекта корзины в свою таблицу, у вас есть имя объекта (предположительно) и его изображение в вашем объекте, и затем вы можете легко установить изображение ячейки = на изображение ваших объектов. Не пытайтесь определить логику отображения изображения внутри метода «cellForRowAtIndexPath». Сохраните изображение и все атрибуты вашего объекта и используйте objectAtIndex, чтобы указать на ваш полный объект и задать ячейку на основе атрибутов ваших объектов.
Комментарии:
1. Привет, большое спасибо за ответ!! А объект cart — это просто копия класса. А что касается добавления изображения в нужное время, разве мой код не будет работать выше? Я прошу пользователя нажать кнопку, а затем добавить ее, когда она добавит ячейку / строку? Вы продолжаете говорить об объекте корзины. Что вы имеете в виду под этим? Как вы думаете, что такое корзина? потому что я не уверен, как это выразить, но cart просто относится к другому классу
2. Вы поняли это?
3. Да, я уверен, я просто добавил изображения в массив, подобный тексту для ячейки. И это сработало идеально! Спасибо за помощь!