Создание пользовательских UITableViewCell в раскадровке

#iphone #objective-c #ios #uitableview #ios5

#iPhone #objective-c #iOS #uitableview #ios5

Вопрос:

Хотите создать статическое меню (IOS 5) и пытаетесь создать пользовательские ячейки в раскадровке, чтобы затем загрузить их в сгруппированный tableview.

Я создал выход

 @property(nonatomic,strong) IBOutlet UITableViewCell *labelCell;
  

Для класса ViewController установлен соответствующий TableViewController, и я подключил пользовательскую ячейку к этому выходу.

У меня также настроены делегат и источник данных.

У меня есть

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   *)indexPath
{
  return self.labelCell;
}
  

Я уверен, что в этом есть тонна ошибок, но я просто пытаюсь отобразить одну ячейку и перейти оттуда. Похоже, что нет никаких примеров создания пользовательских ячеек в IB через раскадровку. Я все еще могу использовать старый способ создания файла xib и загрузки его в mainBundle, но я просто хочу быть в курсе последних событий, я думаю.

но с тем, что у меня есть выше, я получаю сбой при загрузке этого контроллера представления. SIGABRT

Ответ №1:

Вот что я узнал о том, как вы получаете ячейки для своей таблицы при использовании раскадровки. Когда вы перетаскиваете UITableView в свой вид, он поставляется с прототипом ячейки, уже установленной в качестве подвида. Чтобы использовать эту прототипную ячейку, задайте уникальный идентификатор повторного использования в инспекторе атрибутов, а затем используйте тот же идентификатор для удаления ячейки из очереди в вашем cellForRowAtIndexPath: метод. Я оставляю код для создания ячейки с нуля, если вызов dequeue возвращает nil; Я не думаю, что это может произойти. Поэтому просто удалите ячейку из очереди, настройте ее с помощью обычных методов UITableViewCell и верните ее.

Но вы также можете создавать пользовательские подклассы UITableViewCell. Просто задайте имя класса в инспекторе идентификации классов раскадровки и перетащите любые элементы, которые вы хотите, из палитры объектов в свою ячейку. Затем создайте для них свойства IBOutlet в файлах кода вашего подкласса и подключите их к ячейке в раскадровке обычным способом. Это намного лучше, чем делать все это в коде!

И, наконец, в вашей таблице может быть более одного типа ячеек. Просто перетащите объекты UITableViewCell из палитры в таблицу и присвоите каждому уникальный идентификатор повторного использования в инспекторе атрибутов. В вашем методе cellForRowAtIndexPath: выберите тип каждой ячейки, и вы сможете получить очень гибкое представление таблицы.

Комментарии:

1. Все это верно, но вопрос касается статических табличных представлений, которые не используют прототипы.

2. У меня есть новый сценарий (сомнение). Если у меня есть UITableView с пользовательской ячейкой, которая содержит - кнопки и UITextField . вся настройка уже выполнена в соответствии с вашим пунктом № 2, но теперь, если я хочу запретить повторное использование своих ячеек, есть ли какой-нибудь хороший способ сделать это? должен ли я вообще это делать? (мне нужна функциональность добавления более одного идентификатора электронной почты)

3. @jrturton Ах, но некоторые приходят сюда из поиска Google, не понимая «статической» части. Название немного вводит в заблуждение. Итак, этот ответ на самом деле был тем, что я искал.

Ответ №2:

Если вы настроили UITableView использование «статических ячеек» в раскадровке, вам не нужно реализовывать ни один из UITableViewDataSource методов, и вы можете изменить ячейку непосредственно в Interface Builder. Для отдельной ячейки метки выберите ячейку и измените ее тип на «Базовый». Теперь вы можете редактировать ячейку так же, как и любой другой объект просмотра.

Комментарии:

1. Да. Вот и все. Не уверен, почему я вообще не нашел никаких руководств, в которых говорилось бы вам это сделать. Делает это намного проще.

2. Как случайный вопрос, означает ли использование статических ячеек, что у вас есть именно то количество ячеек, которое вы указываете в IB? Поскольку вам не нужно реализовывать методы источника данных, я полагаю, вы не можете изменять данные в своем табличном представлении, и именно поэтому они назвали это статическим, верно?

3. @Warkst — точно. На самом деле, вы должны удалить реализации заглушек методов источника данных.

Ответ №3:

Этот урок был полезен для меня. Вы можете ссылаться на любой объект, который вам нужен, с помощью тега.

В раскадровке перетащите UIImageView или UILabel и т. Д. И Установите для тега значение 100 (что бы вы ни хотели), Затем - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath используйте тег для ссылки на него.

Вот пример кода в руководстве, просто не забудьте установить теги в раскадровке:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Display recipe in the table cell
Recipe *recipe = [recipes objectAtIndex:indexPath.row];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
recipeImageView.image = [UIImage imageNamed:recipe.imageFile];

UILabel *recipeNameLabel = (UILabel *)[cell viewWithTag:101];
recipeNameLabel.text = recipe.name;

UILabel *recipeDetailLabel = (UILabel *)[cell viewWithTag:102];
recipeDetailLabel.text = recipe.detail;

return cell;
 }