【问题标题】:Controlling UISwitch in a custom UITableViewCell在自定义 UITableViewCell 中控制 UISwitch
【发布时间】:2014-03-07 09:12:25
【问题描述】:

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

我现在想要在UITableView 之外有一个单独的 UISwitch - 当它打开时 - 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 中为 tableView 之外的 UISwitch 创建了一个 IBAction 方法

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

这在我的 UITableViewCell 类中运行正确的方法 - 但 UITableView 不反映更改。我添加了[self.myTableView reloadData]; - 但这并没有解决问题。谁能为我阐明一些不是他的光?

****更新****

更新了 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 数据重置为原始状态?

【问题讨论】:

  • 我没有在表格视图的委托 cellForRowAtIndexPath 的任何地方看到对 - (IBAction)selectAllSwitch:(UISwitch *)sender 方法的调用。
  • 在操作方法- (IBAction)selectAllSwitch:(UISwitch *)sender 中,您正在创建新单元格,这将与您的表格视图完全无关或连接您认为它将如何更改表格视图中所有单元格的状态
  • @Allamaprabhu - 那是因为我不想在 tableview 中设置所有开关。 selectAll 开关在表格视图之外。 Shan 我已经纠正了使用与 tableview 中加载的 tableviewcell 相同的实例 - 仍然没有区别。

标签: ios iphone objective-c uitableview


【解决方案1】:

解决问题的逻辑是:

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

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

希望对你有帮助!

编辑

您似乎迷失了方向。因为在 viewController 的 IBAction 中,您正在创建一个 BBMailList 类型的新数组。试试这样:

假设您的self.mailLists 是BBMailList 类型的集合。

现在:

- (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
}

【讨论】:

  • 谢谢 - 我试过了,但没有解决问题。不过感谢您的帮助。
  • 这个答案引导我找到解决方案。我必须在我的 cellForRowAtIndexPath 委托方法中保留开关的选定状态。一切都按我现在的需要工作。谢谢!
【解决方案2】:

将UISwitch 添加到所有单元格并在cellForRowAtIndexPath 隐藏 UISwitch 在您不想显示的单元格中。


您需要添加:

1)状态数组(开/关开关状态)
2)单元格上的状态数组(隐藏/取消隐藏开关)

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

arrayHideUnhide = (@"YES",@"NO",@"YES",@"NO");

arrayOnOff = (@"ON","OFF",@"ON");

【讨论】:

  • 我不想隐藏开关。
  • @Tander - 太好了 - 那么只需要维护一个数组
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多