我有一个带有自定义单元格的表格 View (UISwitch 在表格 View 的每个单元格上)。
我的单元格是这样设置的:
switchView = [[UISwitch alloc] initWithFrame:CGRectMake(200.0f, 5.0f, 75.0f, 30.0f)];
cell.accessoryView = switchView;
[switchView setOn:NO animated:NO];
[switchView addTarget:self actionselector(favorite forControlEvents:UIControlEventValueChanged];
[cell addSubview:switchView];
而用户改变UISwitch 时调用的 Action 是:
-(IBAction)favoriteid)sender
{
indexPath = [self.tableView indexPathForCellUITableViewCell*)[sender superview]];
NSMutableArray *favoriteList = [[NSMutableArray alloc]init];
NSString *favoriteItem = [self.tableView cellForRowAtIndexPath:indexPath].textLabel.text;
NSLog(favoriteItem);
if ([switchView isOn])
{
[favoriteList addObject:favoriteItem];
NSUserDefaults *favoriteDefaults = [NSUserDefaults standardUserDefaults];
[favoriteDefaults setObject:favoriteList forKey"MyFavorites"];
NSLog(@"%@", favoriteList);
}
else
{
[favoriteList removeObject:favoriteItem];
NSUserDefaults *favoriteDefaults = [NSUserDefaults standardUserDefaults];
[favoriteDefaults setObject:favoriteList forKey"MyFavorites"];
NSLog(@"%@", favoriteList);
}
}
问题是:
在测试应用程序时,只有表格 View 的最后一项(单元格)可以正常工作。
对于其他人,调试器返回 UISwitch 的状态始终为“OFF”。
有什么问题?
Best Answer-推荐答案 strong>
几个即时 react :
在 (IBAction)favoriteid)sender 中,您没有抓取相关单元格的 switchView,而只是使用该类 ivar 的最后引用所使用的内容.同样,在您的 cellForRowAtIndexPath 中,您似乎正在设置(并反复重置)这个相同的单个 switchView ivar。可能根本不应该是 ivar。您可以将 switchView 设为 cellForRowAtIndexPath 的局部变量。您也可以将其设为 favorite 的局部变量。但最重要的是,favorite 应该将其设置为 UISwitch *switchView = sender 。
我假设您想将所有收藏夹保存为用户默认设置。你当前的 (IBAction)favoriteid)sender 每次都会重新创建 favoriteList,它要么有一个项目,要么没有项目,但肯定会丢弃你可能选择的任何其他收藏夹过去。
一个小问题,但是如果你设置了附属单元格,你不需要将switchView也添加到 subview 中。
所以,我建议修改 cellForRowAtIndexPath 如下:
NSString *title = [_favorites objectAtIndex:indexPath.row]; // clearly, you'll get the text however you're getting your text now ... I'm just storing in array
cell.textLabel.text = title;
BOOL isFav = [self isFavorite:title]; // go to user defaults and find out if it's there or not
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectMake(200.0f, 5.0f, 75.0f, 30.0f)];
[switchView setOn:isFav animated:NO];
[switchView addTarget:self actionselector(toggleFavoriteSwitch forControlEvents:UIControlEventValueChanged];
cell.accessoryView = switchView;
这使用 isFavorite :
- (BOOL)isFavoriteNSString *)title
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *listOfFavorites = [userDefaults objectForKey:kMyFavsKey];
if (listOfFavorites)
return [listOfFavorites containsObject:title];
return NO;
}
那么,很明显,你需要定义你的toggleFavoriteSwitch (以前称为favorite )方法:
- (IBAction)toggleFavoriteSwitchUISwitch *)switchView
{
UITableViewCell *cell = (UITableViewCell *)[switchView superview];
[self updateFavoriteInUserDefaultsFor:cell.textLabel.text withValue:[switchView isOn]];
}
这是更新用户默认值如下:
- (void)updateFavoriteInUserDefaultsForNSString *)title withValueBOOL)isOn
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *oldFavorites = [userDefaults objectForKey:kMyFavsKey];
NSMutableArray *newFavorites;
if (!oldFavorites)
newFavorites = [[NSMutableArray alloc] init];
else
newFavorites = [NSMutableArray arrayWithArrayldFavorites];
if (isOn)
[newFavorites addObject:title];
else
[newFavorites removeObject:title];
[userDefaults setObject:newFavorites forKey:kMyFavsKey];
[userDefaults synchronize];
}
希望这可以解决您的问题。
关于ios - UITableViewCell 内部的 UISwitch,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/11128520/
|