2

UISwitchカスタムセル(テーブルビューのすべてのセル)を持つテーブルビューがあります。

私は自分のセルを次のように設定しました:

switchView = [[UISwitch alloc] initWithFrame:CGRectMake(200.0f, 5.0f, 75.0f, 30.0f)];
cell.accessoryView = switchView;
[switchView setOn:NO animated:NO];
[switchView addTarget:self action:@selector(favorite:) forControlEvents:UIControlEventValueChanged];
[cell addSubview:switchView];

ユーザーが を変更したときに呼び出されるアクションUISwitchは次のとおりです。

-(IBAction)favorite:(id)sender 
{
    indexPath = [self.tableView indexPathForCell:(UITableViewCell*)[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);
    }
}

問題は
、アプリをテストするときに、テーブル ビューの最後の項目 (セル) だけが正しく機能することです。

その他の場合、デバッガーは の状態UISwitchが常に「OFF」であることを返します。

何が問題ですか?

4

1 に答える 1

4

いくつかの即時の反応:

  1. 問題のセルのswitchView(IBAction)favorite:(id)senderを取得するのではなく、そのクラス ivar の最後の参照で使用されたものを使用するだけです。同様に、あなたのでは、この同じ単一のivarcellForRowAtIndexPathを設定 (および繰り返しリセット) しているように見えます。switchViewおそらく、まったく ivar であってはなりません。switchViewのローカル変数を作成できますcellForRowAtIndexPath。のローカル変数にすることもできますfavorite。しかし、最も重要なfavoriteことは、 として設定する必要がありますUISwitch *switchView = sender

  2. すべてのお気に入りをユーザーのデフォルトに保存したいと思います。current(IBAction)favorite:(id)senderは毎回 favoriteList を再作成し、アイテムが 1 つ含まれるか、アイテムが含まれないかのいずれかになりますが、過去に選択した可能性のある他のお気に入りは確実に破棄されます。

  3. マイナーな点ですが、アクセサリ セルを設定する場合は、switchView もサブビューに追加する必要はありません。

したがって、次のように変更することをお勧め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 action:@selector(toggleFavoriteSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = switchView;

これは以下を使用しますisFavorite

- (BOOL)isFavorite:(NSString *)title
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray *listOfFavorites = [userDefaults objectForKey:kMyFavsKey];

    if (listOfFavorites)
        return [listOfFavorites containsObject:title];

    return NO;
}

toggleFavoriteSwitch次に、明らかに、 (以前は と呼ばれていたfavorite) メソッドを定義する必要があります。

- (IBAction)toggleFavoriteSwitch:(UISwitch *)switchView
{
    UITableViewCell *cell = (UITableViewCell *)[switchView superview];

    [self updateFavoriteInUserDefaultsFor:cell.textLabel.text withValue:[switchView isOn]];
}

そして、これは次のようにユーザーのデフォルトを更新しています:

- (void)updateFavoriteInUserDefaultsFor:(NSString *)title withValue:(BOOL)isOn
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSArray *oldFavorites = [userDefaults objectForKey:kMyFavsKey];

    NSMutableArray *newFavorites;

    if (!oldFavorites)
        newFavorites = [[NSMutableArray alloc] init];
    else
        newFavorites = [NSMutableArray arrayWithArray:oldFavorites];

    if (isOn)
        [newFavorites addObject:title];
    else
        [newFavorites removeObject:title];

    [userDefaults setObject:newFavorites forKey:kMyFavsKey];

    [userDefaults synchronize];
}

うまくいけば、これで問題が解決します。

于 2012-06-22T22:30:09.790 に答える