2013-09-05 2 views
0

В настоящее время я работаю над своим вторым проектом, который фокусируется на CoreData и пользовательских ячейках.Доступ к UISwitch из пользовательской ячейки таблицы

У меня есть пользовательская ячейка с изображением & ярлык & переключатель, я пытаюсь сохранить значение переключателя для userdefaults, когда значение переключателя изменилось. Но я застрял в том, как получить доступ к каждому коммутатору по отдельности (в том же разделе моего представления таблицы есть 2), поэтому, когда нажата кнопка, целое число, сохраненное в userdefaults, мгновенно обновляется.

Это код в .m файле, относящемся к пользовательской ячейке (switchCell), извиняется за любой беспорядочный код и т. Д., Я почти 100% самостоятельно преподаю без каких-либо советов/отзывов о любых ошибках, которые я делаю.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

UITableViewCell *cell = nil; 

// Code for the first section, controlling which cells use the custom cell SwitchCell 
if (indexPath.section == 0) 
{ 
    if(indexPath.row == 1 || indexPath.row == 2) 
    { 
     SwitchCell *switchCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCellIdentifier"]; 
     cell = switchCell; 
    } 

    else 
    { 
     if(cell == nil) 
     { 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"CellIdentifier"]; 
      UISwitch *testSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
      cell.accessoryView = testSwitch; 
     } 
    } 

} 
// Each other section currently uses the standard cell type 
else 
{ 
    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"CellIdentifier"]; 
    } 

} 

[self configureCell:cell atIndexPath:indexPath]; 

return cell; 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 

NSDictionary *dictionary = [settingsTableData objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"Settings"]; 
NSString *cellValue = [array objectAtIndex:indexPath.row]; 
SwitchCell *switchCell = (SwitchCell *)cell; 

[[NSUserDefaults standardUserDefaults] synchronize]; 

// Integers to store the on/off state of each switch (2) 
NSInteger capsValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"capitalsSwitchOn"]; 
NSInteger numbersValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"numbersSwitchOn"]; 
NSLog(@"Upon load capsValue equals : %d", capsValue); 
NSLog(@"upon load numbersValue equals : %d", numbersValue); 

// Setting individual cell values for attributes such as image and text 
if (indexPath.section == 0) 
{ 
    if(indexPath.row == 1) 
    { 
     switchCell.switchCellLabel.text = cellValue; 
     switchCell.switchCellImage.image = [UIImage imageNamed:@"capitalsImage.jpg"]; 

     // Set to true or false depending on what you want the default value to be. 
     //switchCell.switchCellSwitch.on = FALSE; 

     if (capsValue == 1) { 
      [switchCell.switchCellSwitch setOn:NO animated:YES]; 
     } else 
      [switchCell.switchCellSwitch setOn:YES animated:YES]; 

    } 
    else if (indexPath.row == 2) 
    { 
     switchCell.switchCellLabel.text = cellValue; 
     switchCell.switchCellImage.image = [UIImage imageNamed:@"capitalsImage.jpg"]; 

     if (numbersValue == 1) { 
      [switchCell.switchCellSwitch setOn:NO animated:YES]; 
     } else 
      [switchCell.switchCellSwitch setOn:YES animated:YES]; 
    } 
    else 
    { 
     cell.textLabel.text = cellValue; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
} 
else if (indexPath.section == 1) 
{ 
    if (indexPath.row == 0) 
    { 
     cell.textLabel.text = cellValue; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
    else if (indexPath.row == 1) 
    { 
     cell.textLabel.text = cellValue; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
} 
else if (indexPath.section == 2) 
{ 
    if (indexPath.row == 0) 
    { 
     cell.textLabel.text = cellValue; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
    else if (indexPath.row == 1 || indexPath.row == 2) 
    { 
     cell.textLabel.text = cellValue; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
} 

} 

Заранее благодарим за любую помощь!

ответ

0

Добавить IBAction к вашему SwitchCell.

В файле заголовка добавить:

- (IBAction)switchChanged: (UISwitch*)sender; 

И в файле .m применяются:

- (IBAction)switchChanged: (UISwitch*)sender { 
    BOOL value = sender.isOn; 

    // Do your Core Data work here 
} 

Вы, возможно, придется добавить свойство SwitchCell, так что он знает, что запись базы данных для создание/изменение.

Затем зайдите в свою раскадровку или .nib-файл, нажмите на UISwitch, откройте последнюю вкладку в инспекторе объектов. Там вы сможете увидеть Send Events -> Value Changed. Перетащите соединение с этого на ваш SwitchCell, выберите свой IBAction, и вам должно быть хорошо идти.

+0

Тим почему ты предполагаешь, что он использует раскадровку? :) –

+0

@AuRis он бы назвал 'dequeueReusableCellWithIdentifier: @" SwitchCellIdentifier ", если он не использовал Storyboard или .nib-файл? Я мог ошибаться, но как бы вы определили/построили ячейку для этого Идентификатора, если не через .nib или раскадровку? –

+0

Эй, я использую файлы .nib, так как обучение коду у меня создалось впечатление, что раскадровка - это не путь; следовательно, почему ive избегал их! –

1

Я бы добавил, что переключатель в вашей подклассе ячейки, а не в viewController. Затем в подклассе ячейки создайте делегат, который вызовет метод, например switchDidChangeValue в viewController. Там установлены настройки по умолчанию.

+0

Если я понимаю, что я создал переключатель в подклассовой ячейке вместе с меткой и изображением (testSwitch - это проверка нестандартного сотового способа приближения к этой проблеме, чего я бы хотел избежать). Я также не использовал делегатов раньше, это 100% необходимо для этого? Или вы скажете, что это лучшая практика? –

0

Так много кодов :-), и я не суп, если я понимаю ваш разум или нет. Но я думаю, может быть, вы можете определить два свойства в вашем ViewController для двух выключателей, switchOne и switchTwo, и назначать их в функции

tableView:cellForRowAtIndexPath: 

Я всегда делаю это, когда у меня есть независимый контроль в сгруппированных Tableview.

Еще у меня есть вопрос о вашем коде:

  1. Вы имеете в виду вторую и третью ячейку в первом разделе ячейки с выключателями?

  2. Я думаю, что в вашем коде

    если (indexPath.row == 1 || indexPath.row == 2) {
    SwitchCell * switchCell = [tableView dequeueReusableCellWithIdentifier: @ "SwitchCellIdentifier"];
    cell = switchCell; } клетка всегда будет нолем, потому что вы никогда не построить ячейку с идентификатором «SwitchCellIdentifier»

  3. Я думаю, что вы строите управление переключателем для других ячеек первого раздела, так что я совершенно не имею понятия, что вы хотите

Это 2 часа ночи здесь, в Китае, я работал всю ночь, и я очень пробовал, так что, может быть, ваш код прав, и я неправильно понял, если да, пожалуйста, дайте мне знать.

+0

Эй, спасибо за то, что вы пытаетесь понять, мне очень сложно объяснить проблему, поскольку она оставила меня довольно запутанной с моей кодировкой! В принципе у меня нет проблем с созданием ячеек, они все в порядке, у меня просто нет доступа к переключателям, созданным в моих настраиваемых ячейках (раздел 0, строка 1 и 2, которые созданы отлично). –

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