2012-03-13 3 views
1

Я хочу добавить UIPickerView в UITableViewCell. Прямо сейчас я просто получаю черное окно. Может ли кто-то объяснить мне понятие подкласса объектов UI для ячейки, то есть: когда мы делаем нашу ячейку в качестве делегата и делегата datasource? БлагодаряДобавление UIPickerView в UITableViewCell

EDIT: Вот код, что я делаю сейчас

case 1: { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"groups"]; 
     if (cell == nil) { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"groups"]; 
     } 
      /*NSString *myGroupDetail = [_groupArray objectAtIndex:indexPath.row]; 
      NSLog(@"the group detail label is %@",myGroupDetail); 
      cell.textLabel.text = myGroupDetail; 
      */ 
     [cell addSubview:_groupPicker]; 

     break; 

    } 

Группы является раздел, в котором я хочу, вид сборщика, я получаю, что данные из массива. Here is what i want to implement

ответ

7

Вам необходимо будет выделить и инициализировать pickerview в вашем методе cellForRow для tableviewdelegate. больной эскиз для Вас =) как инициализировать ячейку сама не должно быть трудно найти, если вы Google немного ;-)

...(tableView *)... cellForRowAtIndexPath... { 

if(indexPath.row == pickerRow){ 
    UIPickerView *pickerView = [[UIPickerView alloc]init]; 
    cell = ... // alloc and initialize a cell 
    cell addSubview:pickerView]; 
    } 
else{ // your other cells } 

return cell; 
} 

UPDATE: им в настоящее время возникают проблемы с мерзавцем, поэтому я загрузил пример проекта для моего частного сервера: UITablePicker example

GitHub: https://github.com/sebamisc/UItableViewWithPicker

юй может модифицировать и использовать код, но вы хотите =)

Себастиан

+0

Я обновил свой код. Я использую то же самое. У меня есть мой делегат и источник данных, подключенный к viewcontroller с помощью раскадровки. Все еще получаю черный экран ... Спасибо за ответ –

+1

можете ли вы отправить обновленный код =)? –

+0

Я обновил вопрос, должен ли я публиковать свои методы делегата? –

0

Ну, я никогда этого не делал.

Должно ли это быть в ячейке или вы могли бы использовать представление заголовка или нижнего колонтитула таблицы для этого? (Я бы не предлагал просмотр заголовка/нижнего колонтитула раздела.)

Предполагая, что он находится в UITableViewCell. Да, я лично буду подклассифицировать UITableViewCell. Это было много. В этом случае объект ячейки может быть делегатом источника данных сборщика. Для этого ваш подкласс UITableViewCell (предположим, вы называете его MyTableViewCell) должен выполнить соответствующий протокол. Вы добавляете этот UIPickerView программно в метод init (initWithStyle) MyTableViewCell. Для макета внутри ячейки таблицы вы должны перезаписать метод layoutSubviews. Если ваше приложение можно повернуть в альбомную и портретную ориентации и/или если ваше приложение также предназначено для работы на iPad, то этот метод должен динамически рассматривать границы таблицы. (Часто используются экраны или рамки windwo, но это не сохраняется, когда таблица отображается в разделенном главном представлении или всплывающем представлении на iPads.)

Строго сказано, что ваш MyTableViewCell не должен быть делегатом источника данных, просто потому, что это элемент вида, а объекты представления не должны управлять какой-либо бизнес-логикой в ​​шаблоне проектирования MVC. Умнее было бы внедрение некоторого выделенного контроллера представлений для вашей таблицы сокета, который соответствует протоколу и назначается в качестве делегата. Однако оба будут работать. В случае, если это единственный вид выбора в вашей продаже, вы можете легко использовать свой подкласс UITableViewController, даже не помещая UIPickerView.

Альтернативой подклассу UITableViewCell является создание UIPickerView в методе cellForRowAtIndexPath вашего TableViewController. Это подходит для приложений с одной ориентацией. Однако вы можете настроить его таким образом, чтобы он автоматически перенастраивал UIPickerView.

В любом случае вы должны перезаписать метод heightForRowAtIndexPath UITableViewController, если ваши представления в таблице не имеют такой же высоты. Если все они имеют одинаковую высоту, вы можете просто установить свойство rowHeight вашего UITableView.

+0

Я обновил свой вопрос .. что вы предлагаете мне делать? Спасибо за ответ. –

+0

Пример, который связал Себастьян, выглядит для меня хорошо. Он предназначен для таблицы с одной ячейкой. Просто подумайте, что ваша таблица немного сложнее. Это означает, что содержимое cellForRowAtIndexPath в этом примере входит в ваш блок «case 1». И ваш heightForRowAtIndexPath должен вернуть 180.0f только для секций 1 и 30.0f (или что-то подходящее) во всех остальных случаях. Отверстие должно хорошо работать, когда в представлении таблицы есть только один выборщик. Если вы добавите второй сборщик позже, вам необходимо изменить решение. –

+0

Да, это здорово, приведенный пример. Все отлично работает. Теперь проблема заключается в том, как уменьшить размер сборщика, т. Е. Высоту сборщика. я googled и увидел, что Apple исправила его, и нет прямого способа его изменения. –

Смежные вопросы