2010-09-22 8 views
72

Как вставить UISwitch на ячейку UITableView? Примеры можно увидеть в меню настроек.UISwitch в ячейке UITableView

Мое текущее решение:

UISwitch *mySwitch = [[[UISwitch alloc] init] autorelease]; 
cell.accessoryView = mySwitch; 
+3

Что случилось с тем, как вы это делаете? – MobileMon

ответ

183

Устанавливая его как дополнительное оборудование, как правило, это путь. Вы можете установить его в tableView:cellForRowAtIndexPath:. Вы можете использовать цель/действие, чтобы что-то сделать, когда переключатель перевернут. Нравится так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    switch([indexPath row]) { 
     case MY_SWITCH_CELL: { 
      UITableViewCell *aCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell"]; 
      if(aCell == nil) { 
       aCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"SwitchCell"] autorelease]; 
       aCell.textLabel.text = @"I Have A Switch"; 
       aCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; 
       aCell.accessoryView = switchView; 
       [switchView setOn:NO animated:NO]; 
       [switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 
       [switchView release]; 
      } 
      return aCell; 
     } 
     break; 
    } 
    return nil; 
} 

- (void)switchChanged:(id)sender { 
    UISwitch *switchControl = sender; 
    NSLog(@"The switch is %@", switchControl.on ? @"ON" : @"OFF"); 
} 
+1

Вместо MY_SWITCH_CELL должен быть соответствующий номер ячейки, я думаю. Приятное решение! – testing

+2

Хорошая точка с aCell.accessoryView = switchView; – konradowy

+0

как вы пишете 'aCell.accessoryView = switchView;' с нотной скобкой? – Jesse

10

Вы можете добавить UISwitch или любой другой элемент управления в ячейки accessoryView. Таким образом, он появится в правой части ячейки, что, вероятно, то, что вы хотите.

2

Вы можете подготовить ячейку в Interfacebuilder, связать ее с IBOutlet вашего Viewcontroller и вернуть его, когда tableview запрашивает правильную строку.

Вместо этого вы можете создать отдельный xib для ячейки (снова с IB) и загрузить его с помощью UINib при создании ячеек.

Наконец, вы можете создать коммутатор программно и добавить его в свой контент содержимого контента или содержимого.

Какой из них вам подходит, во многом зависит от того, что вам нравится делать. Если ваше содержимое таблицы фиксировано (для страницы настроек и т. Д.), Первые два могут работать хорошо, если контент динамический, я бы предпочел программное решение. Пожалуйста, будьте более конкретными в том, что вы хотели бы сделать, это облегчило бы ответ на ваш вопрос.

+0

Я бы предпочел программное решение (несмотря на это для страницы настроек), но мне также интересно, как работают первые два варианта. Возможно, вы могли бы объяснить их немного подробнее. – testing

8
if (indexPath.row == 0) {//If you want UISwitch on particular row 
    UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    [cell addSubview:theSwitch]; 
    cell.accessoryView = theSwitch; 
} 
+0

Почему вы используете 'initWithFrame'? Почему вы используете 'addSubview'? 'switch' не может использоваться как имя переменной. – testing

+0

Извините за имя переключателя. У меня был код. Я просто изменил имя переменной в нем. – kthorat

+0

Это сработало для меня. Эффективное решение с меньшим количеством кода. –

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