UISwitch в TableViewCell - Изменить текст ячейки при переключении - PullRequest
0 голосов
/ 20 ноября 2010

Я хочу, чтобы UIS-переключатель внутри TableViewCell изменял текст с «Активный» на «Отключен» и наоборот при переключении, но при изменении переключателя все данные в моем табличном представлении исчезают.Я использую «перезагрузить данные», так как я не знаю, как изменить текст конкретной ячейки.

К вашему сведению, 'текущий элемент' является основным объектом данных со свойством BOOL 'itemEnabled'.

Переключатель виден только в «режиме редактирования».

У меня есть переключатель UIS в ячейке табличного представления в моем «контроллере подробного представления»:

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

UITableViewCell *cell = nil;
NSString *cellDetail = nil;

        static NSString *EnabledCellIdentifier = @"Enabled";
        cell = [tableView dequeueReusableCellWithIdentifier:EnabledCellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EnabledCellIdentifier] autorelease];
            UISwitch* actSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
            [cell setEditingAccessoryView:actSwitch];
            [actSwitch addTarget:self action:@selector(actSwitchChanged:) forControlEvents:UIControlEventValueChanged];
            if ([[currentItem valueForKey:@"itemEnabled"] boolValue]) {
                cellDetail = @"Active";
                actSwitch.on = YES;
            } else {
                cellDetail = @"Disabled";
                actSwitch.on = NO;
            }
            [actSwitch release];

    cell.textLabel.text = cellDetail;

return cell;

}

У меня есть метод для получения действия:

- (void)actSwitchChanged:(id)sender {

UISwitch* swEnabled = (UISwitch*)sender;

NSManagedObjectContext* itemContext = [currentItem managedObjectContext];

currentItem.itemEnabled = [NSNumber numberWithBool:swEnabled.on];

NSError *error = nil;
if (![itemContext save:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

}

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Вот подход к получению ячейки из метода действия, который не требует создания подкласса UISwitch:

- (void)switchAction:(id)sender {

     // Cast the sender as a UISwitch
     UISwitch *aSwitch = (UISwitch *)sender;

     // Cast the superview of aSwitch to a UITableViewCell
     UITableViewCell *cell = (UITableViewCell *)aSwitch.superview;

     // You could get an indexPath as follows (though you don't need it in this case)
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];    

     // Set the text of the label in your cell
     cell.textLabel.text = aSwitch.on ? @"Active"; : @"Disabled";
}
1 голос
/ 20 ноября 2010

Вы можете получить определенную ячейку с -[UITableView cellForRowAtIndexPath:]. Вам просто нужно знать путь индекса ячейки (также обратите внимание, что вы запрашиваете представление таблицы для ячейки, а не вызываете метод делегата).

0 голосов
/ 27 октября 2015

Еще одна вариация на тему! Если у вас много полей настроек с кнопками переключения, вы можете использовать что-то вроде этого, чтобы получить текст метки, связанный с кнопкой переключения, которая была триггером! Вы можете установить текст, используя обычные методы!

@IBAction func switch(sender: UISwitch) {
  let labelIndex = sender.superview!.subviews.indexOf({$0 is UILabel})
  NSLog("The text from the label associated with this switch is %@",
  (sender.superview!.subviews[labelIndex!] as! UILabel).text!)
}
0 голосов
/ 20 ноября 2010

Итак, я подклассифицировал UISwtich и включил свойство для хранения пути индекса ячейки, которое затем можно использовать в методе действия:

- (void)actSwitchChanged:(id)sender {

TLSwitchInCell* swEnabled = (TLSwitchInCell*)sender;

currentItem.itemEnabled = [NSNumber numberWithBool:swEnabled.on];

UITableViewCell* theCell = [self.tableView cellForRowAtIndexPath:swEnabled.cellIndexPath];

theCell.textLabel.text = swEnabled.on ? @"Active" : @"Disabled";

}

...