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