在自定义UITableViewCell中控制UISwitch

时间:2014-02-10 06:28:16

标签: ios iphone objective-c uitableview

我为单元格创建了一个自定义UITableViewCell和一个类。然后我将我的viewController中的这个单元格加载到tableview中。自定义单元格具有标签和UiSwitch。我已设法让切换按照我的意愿工作并更改需要更改的值。

我现在想要一个单独的UISwitch在UITableView之外 - 当它打开时 - UITableView中的所有开关都打开了。

出于某种原因,我不能让这个工作。

这是自定义单元格的代码:

- (void)selectAllSwitches:(BOOL)selected 
{
    if (selected){
        [self.selectSwitch setOn:YES animated:YES];
    }else{
        [self.selectSwitch setOn:NO animated:YES];
    }

}
-(void)setMaillist:(BBMailList *)aMaillist
{
    maillist = aMaillist;

    if (maillist){
        self.nameLabel.text = maillist.name;

        if (self.maillist.isSubscribed){
            self.selectSwitch.on = YES;
        }else{
            self.selectSwitch.on = NO;
        }
    }
}

- (IBAction)switchControl:(UISwitch *)sender
{
    self.maillist.isSubscribed = !self.maillist.isSubscribed;

    NSLog (@"IsSubScribed: %ul", self.maillist.isSubscribed);

    if (self.maillist.isSubscribed){
        self.selectSwitch.on = YES;
    }else{
        self.selectSwitch.on = NO;
    }
}

然后在cellForRowAtIndexPath:

static NSString *mailListTableViewCellIdentifier = @"BBMailListTableViewCell";

if (tableView == self.maillistTableview ){

    BBMailListTableViewCell * maillistTableviewCell = [self.maillistTableview dequeueReusableCellWithIdentifier:mailListTableViewCellIdentifier];
    if (!maillistTableviewCell){
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:mailListTableViewCellIdentifier owner:self options:nil];
        maillistTableviewCell = nib[0];
    }


    if ([self.mailLists count ] > 0){
        NSMutableArray *newArray = [NSMutableArray arrayWithArray:self.mailLists];
        [newArray removeLastObject];
        [newArray removeLastObject];
        [self.maillistTableview setContentSize:CGSizeMake(320, 400)];

        BBMailList *maillist = newArray[indexPath.row];

        maillistTableviewCell.maillist = maillist;
    }

    return maillistTableviewCell;
}

此代码可以正常运行。

然后我在viewController中创建了一个IBAction方法,用于UISwitch,它位于tableView之外

- (IBAction)selectAllSwitch:(UISwitch *)sender
{
    BBMailListTableViewCell *switchButton = [[BBMailListTableViewCell alloc]init];
    [switchButton selectAllSwitches:YES];
}

这在我的UITableViewCell类中运行正确的方法 - 但UITableView不反映更改。我添加了[self.myTableView reloadData]; - 但这并没有解决问题。任何人都可以为我提供一些不是他的光吗?

**** **** UPDATE

在UITableView

之外更新了UISwitch的代码
- (IBAction)selectAllSwitch:(UISwitch *)sender
{

    BBMailList *tempMailList = [[BBMailList alloc]init];

    tempMailList.isSubscribed = YES; 

    [self.maillistTableViewCell setMaillist:tempMailList];

    [self.maillistTableViewCell selectAllSwitches:YES];


    [self.maillistTableview reloadData];


}

每个mailistItem都是我用来存储数据的NSObject。上面的代码运行正确的方法 - 但似乎我没有保持状态可能和[self.mayTableView reloadData];运行 - 它将tableview数据重置为原始状态?

2 个答案:

答案 0 :(得分:2)

解决问题的逻辑是:

1)从您的代码中看,开/关功能取决于您的maillist.isSubscribed属性。在IBAction的viewcontroller中,将其设置为true

2)在此IBAction中呼叫[self.myTableView reloadData];。因此,一旦表格加载单元格,阵列的元素将帮助开关设置为ON / OFF。

希望它有所帮助!

修改

好像你正在失去你的轨道。因为在您的viewController的IBAction中,您正在创建一个类型为BBMailList的新数组。试试这样:

假设您的self.mailListsBBMailList类型的集合。

现在:

- (IBAction)selectAllSwitch:(UISwitch *)sender
{
    // loop through each array element set it to true.
    for (BBMailList *tempMailList in self.mailLists)
    {
        tempMailList.isSubscribed = Yes;
    }

    // reload table data so once table
    [self.maillistTableview reloadData];
}

并在cellForRowAtIndexPath中更改您的邮件列表设置:

if ([self.mailLists count ] > 0){
    NSMutableArray *newArray = [NSMutableArray arrayWithArray:self.mailLists];
    [newArray removeLastObject];
    [newArray removeLastObject];
    [self.maillistTableview setContentSize:CGSizeMake(320, 400)];

    BBMailList *maillist = newArray[indexPath.row];

    [maillistTableviewCell setMaillist: maillist]; // <--- Changed this line
}

答案 1 :(得分:2)

UISwitch添加到所有单元格,并在您不希望显示的单元格中cellForRowAtIndexPath 隐藏 UISwitch


您需要添加:

1)状态数组(开/关开关状态)
2)用于状态(隐藏/取消隐藏开关)的数组

然后将状态数组更改为应用程序逻辑 当你重新加载UITableView数据时,它应该根据状态的数组值显示数据 例如

arrayHideUnhide =(@“YES”,@“NO”,@“YES”,@“NO”);

arrayOnOff =(@“ON”,“OFF”,@“ON”);