OStack程序员社区-中国程序员成长平台

标题: ios - UITableViewCell 内部的 UISwitch [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 21:30
标题: ios - UITableViewCell 内部的 UISwitch

我有一个带有自定义单元格的表格 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-推荐答案


几个即时 react :

  1. (IBAction)favoriteid)sender 中,您没有抓取相关单元格的 switchView,而只是使用该类 ivar 的最后引用所使用的内容.同样,在您的 cellForRowAtIndexPath 中,您似乎正在设置(并反复重置)这个相同的单个 switchView ivar。可能根本不应该是 ivar。您可以将 switchView 设为 cellForRowAtIndexPath 的局部变量。您也可以将其设为 favorite 的局部变量。但最重要的是,favorite 应该将其设置为 UISwitch *switchView = sender

  2. 我假设您想将所有收藏夹保存为用户默认设置。你当前的 (IBAction)favoriteid)sender 每次都会重新创建 favoriteList,它要么有一个项目,要么没有项目,但肯定会丢弃你可能选择的任何其他收藏夹过去。

  3. 一个小问题,但是如果你设置了附属单元格,你不需要将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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4