0

状態が持続するはずのチェックボックスを持つカスタムTableViewCellを取得しました。私の問題は、tableView をカスタム セルと通信させる方法です。たとえば、ユーザーがボタンを押したときにオブジェクトを格納するときに、ユーザーがボタンを押した TableView 行を知る必要があり、それを渡すことができる必要があります。 NSUserDefaults キーに使用する TableView のキー。どうすればいいですか?

- (IBAction)flagLectureButtonPressed:(UIButton *)sender
{
    NSLog(@"sender %@",sender.description);
        UIImage* selectedButton=[UIImage imageNamed:@"checkmarkSelected.png"];
        UIImage* unselectedButton=[UIImage imageNamed:@"checkmark.png"];

        if (sender.currentImage == unselectedButton) {
            [sender setSelected:YES];
            [sender setImage:selectedButton forState:UIControlStateNormal];
            [self saveflagButtonState:kButtonFlagged forButton:sender];
        } else {
            [sender setSelected:NO];
            [sender setImage:unselectedButton forState:UIControlStateNormal];
            [self saveflagButtonState:kButtonNormal forButton:sender];
        }
}

- (void) saveflagButtonState:(ButtonState)state forButton: (UIButton *)sender
{
    static int i = 0;
    NSString *object;
    if (state == kButtonFlagged) {
        object = @"flaged";
    } else if (state == kButtonNormal) {
        object = @"normal";
    }

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:object forKey:@"key"];
    [defaults synchronize];
}

- (void) setTagLectureButton:(UIButton *)tagLectureButton
{

    UIImage* selectedButton=[UIImage imageNamed:@"checkmarkSelected.png"];
    UIImage* unselectedButton=[UIImage imageNamed:@"checkmark.png"];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *buttonIsTaged = [defaults stringForKey:@"key"];
    if (buttonIsTaged) {
        [tagLectureButton setImage:selectedButton forState:UIControlStateNormal];
    } else {
        [tagLectureButton setImage:unselectedButton forState:UIControlStateNormal];
    }
}

@end
4

1 に答える 1

2

良い方法は、カスタム セル クラスを使用することです。そのセル クラスでボタンを管理し、ユーザー インタラクションにどのように反応するかを設定します。セルは、識別情報を保持するためのプロパティを提供する必要があります ( で設定しますtableView:cellForRowAtIndexPath:)。セルは、セル自体 (識別情報を取得してセルのプロパティを変更できるようにするため) と選択状態を渡すコールバックも提供する必要があります。のようなものcustomCell:didUpdateSelectionState:

tagボタンに を設定し(再びtableView:cellForRowAtIndexPath:)、ボタン イベント ( flagLectureButtonPressed、セルの代わりにコントローラーで処理されるようになりました) を取得すると、タグ番号を取得できるというあまり良い方法ではありません。


コールバックには、2 つのレベルの複雑さがあります。 1. セレクター。2. プロトコル。セレクター オプションは単純ですが、コンパイラーの検証やパラメーターのオプションはほとんど提供されません。プロトコル メソッドはもう少し複雑ですが、より検証されており、より柔軟です。

1.

cell サブクラスに、2 つのプロパティが追加されます。

@property (weak, nonatomic) id selectionTarget;
@property (assign, nonatomic) SEL selectionAction;

そして、正しい形式セレクターを提供するために、自分自身 (または将来コードを保守する人) に依存します。次に、ボタンがタップされると:

[self.selectionTarget performSelector:self.selectionAction withObject:self withObject:selectionState];

selectionStateこの場合はNSNumber/ NSString/ etc (整数ではなくオブジェクト) であることに注意してください。

2.

プロトコルを定義します (... を適切な名前に置き換えます):

@protocol ...CellDelegate
- (void)customCell:(... *)cell didUpdateSelectionState:(ButtonState)state;
@end

次に、セルに 1 つのプロパティを追加します。

@property (weak, nonatomic) id < ...CellDelegate > selectionDelegate;

次に、ボタンがタップされると:

[self.selectionDelegate customCell:self didUpdateSelectionState:selectionState];
于 2013-07-06T13:24:02.467 に答える