我为单元格创建了一个自定义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数据重置为原始状态?
答案 0 :(得分:2)
解决问题的逻辑是:
1)从您的代码中看,开/关功能取决于您的maillist.isSubscribed
属性。在IBAction
的viewcontroller中,将其设置为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
}
答案 1 :(得分:2)
将UISwitch
添加到所有单元格,并在您不希望显示的单元格中cellForRowAtIndexPath
隐藏 UISwitch
。
您需要添加:
1)状态数组(开/关开关状态)
2)用于状态(隐藏/取消隐藏开关)的数组
然后将状态数组更改为应用程序逻辑
当你重新加载UITableView
数据时,它应该根据状态的数组值显示数据
例如
arrayHideUnhide =(@“YES”,@“NO”,@“YES”,@“NO”);
arrayOnOff =(@“ON”,“OFF”,@“ON”);