6

複数のUISwitchコントロールを備えたテーブルビューコントローラーがあります。すべてのスイッチに対して同じアクションでデリゲートをテーブルビューコントローラーに設定しました。どのスイッチが変更されたかを判別できる必要があるため、各スイッチの名前を含む文字列の配列を作成します。配列内のインデックスは、各UISwitchのtagプロパティに配置されます。

ただし、他の目的でtagプロパティを使用する準備ができています。つまり、viewWithTagを使用してcellForRowAtIndexPathのセルで適切なコントロールを見つけることができます。(各セル内に設定する必要があるものがいくつかあります。)

それで、私はここで正しい線に沿って考えていますか?どのUISwitchがその値を変更したかを正確に見つける方法にはかなり制限があると感じているので、それを使って何か便利なことができます。

4

4 に答える 4

5

UISwitch を次のようにサブクラス化することでこれを修正しました。

@interface NamedUISwitch : UISwitch {
NSString *name;

}

これは洗練されており (インデックス配列は必要ありません)、タグ プロパティは自由に実行できます。

ただし、Objective-C でのサブクラス化には注意が必要だと読みました...

于 2010-04-01T21:49:13.027 に答える
1

どのスイッチの値が変更されたかを追跡しようとするときに役立つ、値変更制御イベント用のブロックベースのハンドラーを使用してUISwitchサブクラスを作成しました。理想的には、サブクラス化ではなく構成で同様のことを行うことができますが、これは私のニーズにはうまく機能します。

https://gist.github.com/3958325

次のように使用できます。

ZUISwitch *mySwitch = [ZUISwitch alloc] init];

[mySwitch onValueChange:^(UISwitch *uiSwitch) {
        if (uiSwitch.on) {
            // do something
        } else {
            // do something else
        }
    }];

スイッチをビューにドラッグし、そのクラスをZUISwitchに変更することで、XIBファイルから使用することもできます。

于 2012-10-26T11:56:34.607 に答える
0

あなたはあなたのアプローチに近づいています。同様の状況で私が行ったことは、個別の UITableViewCell サブクラスを作成し、UISwitch のタグをインデックス パスの index.row に設定し、テーブル ビューの特定のセクションでその UITableViewCell サブクラスのみを使用することです。これにより、セルのタグを使用して、別のインデックス リストを維持することなく、どのセルにイベントがあるかを一意に判断できます (そうしているように聞こえます)。

セル タイプは一意であるため、UITableViewCell サブクラスでメソッド/プロパティを作成することにより、セルの他の要素に簡単にアクセスできます。

例えば:

@interface TableViewToggleCell : UITableViewCell {
    IBOutlet UILabel *toggleNameLabel;
    IBOutlet UILabel *detailedTextLabel;
    IBOutlet UISwitch *toggle;
    NSNumber *value;
    id owner;
}

@property (nonatomic, retain) UILabel *toggleNameLabel;
@property (nonatomic, retain) UILabel *detailedTextLabel;
@property (nonatomic, retain) UISwitch *toggle;
@property (nonatomic, retain) id owner;

-(void) setLable:(NSString*)aString;
-(void) setValue:(NSNumber*)aNum;
-(NSNumber*)value;
-(void) setTagOnToggle:(NSInteger)aTag;

-(IBAction)toggleValue:(id)sender;

@end

の:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ... prior iniitalization code for creating cell is assumed
toggleCell.owner = self;
[toggleCell setLable:@"some string value"];
[toggleCell setTagOnToggle:indexPath.row];
toggleCell.owner = self;
return toggleCell;
   //...  handle cell set up for other cell types as needed
}

所有者はセルのデリゲートであり、コントローラーでアクションを開始するために使用できます。UISwitch の状態が変化したときにデリゲートでアクションを開始できるように、必ず UISwitch を toggleValue アクションに接続してください。

-(IBAction)toggleValue:(id)sender;
{
    BOOL oldValue = [value boolValue];
    [value release];
    value = [[NSNumber numberWithBool:!oldValue] retain];
    [owner performSelector:@selector(someAction:) withObject:toggle];
}

メソッド呼び出しで UISwitch を渡すと、セルのインデックス パスにアクセスできます。セルの NSIndexPath を格納する ivar を明示的に設定し、メソッド呼び出しでセル全体を渡すことで、タグ プロパティの使用をバイパスすることもできます。

于 2010-04-01T12:52:47.560 に答える