UITwitch in UITableViewCell - 切换时更改单元格文本

时间:2010-11-19 22:50:04

标签: iphone uitableview uiswitch reloaddata

我希望TableViewCell中的UISwitch在切换时将文本从“Active”更改为“Disabled”,反之亦然,但是当切换发生变化时,表格视图中的所有数据都会消失。我正在使用“重新加载数据”,因为我不知道如何更改特定单元格的文本。

仅供参考,'当前项'是具有BOOL属性'itemEnabled'的核心数据实体。

此开关仅在“编辑模式”期间可见。

我的'详细视图控制器'中的表格视图单元格中有一个UISwitch:

- (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 个答案:

答案 0 :(得分:2)

这是一种从动作方法中获取单元格的方法,该方法不需要子类化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 :(得分:1)

您可以使用-[UITableView cellForRowAtIndexPath:]获取特定单元格。您只需要知道单元格的索引路径(还要注意您要求查看单元格的tableview,而不是调用委托方法)。

答案 2 :(得分:0)

所以我将UISwtich子类化并包含用于存储单元格索引路径的属性,然后可以在action方法中使用:

- (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";

}

答案 3 :(得分:0)

主题的另一个变体!如果你有很多带开关按钮的设置字段,你可以使用这样的东西来获取与触发的开关按钮相关联的标签文本!您可以使用常用方法设置文本!

@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!)
}