0

警告: 私は自分の質問に対する答えを探しましたが、いくつかはそれに近づきましたが、まだ何かが欠けています。シナリオは次のとおりです。

テーブル内のデータに基づいて、実行時に動的に esUITableViewCellを含む sを作成する方法が必要です(これは可能です)。UISwitch問題は、そのビューが変更されたときに値を取得できるようにスイッチを接続することになります(ナビゲートする、閉じるなど)。イベントを使用してUIControlEventValueChanged通知しようとしましたが、そのスイッチがタップされたときにダンプするため、正しく指定できませんでした。また、スイッチを一意に識別する方法がないように思われるため、すべてのイベントが 1 つのルーチン (理想的) によって処理される場合、それらを区別することはできません。

そう...

UITableView がある場合:

@interface RootViewController : UITableViewController 
{
    UISwitch * autoLockSwitch;
}

@property (nonatomic, retain) UISwitch * autoLockSwitch;
-(void) switchFlipState: (id) sender;
@end

// .m ファイル:

@implementation RootViewController
// ...


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString * CellIdentifier = @"Cell";
    int row          = 0;
    NSString * label = nil;
    TableCellDef_t  * cell_def = nil;

    row = indexPath.row;
    cell_def = &mainMenuTableCellsDef[ row ];

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    label = (NSString *) mainMenuTableCellsDef[indexPath.row].text;
    [cell.textLabel setText:(NSString *) mainMenuItemStrings[ indexPath.row ]];
    if (cell_def->isSpecial)  // call special func/method to add switch et al to cell.
    {
        (*cell_def->isSpecial)(cell );  // add switch, button, etc.
    }
    else
    {
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
}


and this is the 'special' function:

-(void) autoLockSpecialItem :(UITableViewCell *) cell
{
    autoLockSwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
    [autoLockSwitch addTarget:self action:@selector(switchFlipState:) forControlEvents:UIControlEventValueChanged ];
    [cell addSubview:autoLockSwitch];
    cell.accessoryView = autoLockSwitch;
}

そして最後に:

-(void) switchFlipState: (id) sender
{
    NSLog(@"FLIPPED");
}

================================================== ============

質問:

  1. スイッチをタップするとクラッシュするのはなぜですか (悪いセレクター)? 私のコードは、私が見たすべてのサンプル コードに従っていると思いますが、明らかに何かが間違っています。

  2. インスタンス メソッドを関数ポインタとしてテーブルに配置することはできません。クラスメソッドも好きではないようです。「C/C++」関数にした場合、クラス/インスタンスのメンバー変数にアクセスするにはどうすればよいですか? つまり、メンバー変数autoLockSpecialItemを取得できるように、呼び出しを静的テーブル (または合理的なファクシミリ)に入れたい場合はどうなりますか? autoLockSwitchそれをクラス メソッドにしてautoLockSwitchvar を static にすると、それは有効になりますか?

  3. より簡単に: をビューに接続するにはどうすればよいですかUIControlEventValueChanged(試行して失敗しました)、変更されたスイッチをイベント ハンドラー内で実行時に区別できますか?

  4. より良い方法はありますか?この種の問題を解決しなければならないのは、私が最初だとは信じられません。

長々と申し訳ありませんが、お気遣いに感謝し、すべての助けに感謝します。

:bp:

4

2 に答える 2

0

まず、さまざまなスイッチを定義する簡単な方法は、行番号に基づいてタグを定義することです。スイッチの 1 つがタップさsender.tagれると、この方法で行番号を取得するためにアクセスできます。

また、実際のセルではなく、セルのコンテンツ ビューにスイッチを追加する必要があります[cell.contentView addSubview:autoLockSwitch]。また、フレームを設定する必要があります (注意CGRectZero、cocoa は幅と高さを無視しますが、x、y 座標を使用してセル内のスイッチを配置する場所を定義します。

于 2010-08-27T00:23:58.463 に答える
0

メソッドが接続されていない理由はわかりませんが、「スイッチが変更されたイベントハンドラー内で実行時に区別する」簡単な方法は、イベントハンドラーに指定された (id) 送信者を取得し、テーブルビューをウォークし、各テーブル項目に存在する場合、送信者を任意のスイッチと比較します。それが遅すぎる場合は、送信者をテーブル セルに接続するハッシュ テーブルなどを最適化することができます。

C 関数ポインターを使用する場合は、オブジェクトを関数に渡して、関数内でオブジェクトのプロパティ アクセサー メソッドを呼び出すために使用する必要があります。(または、オブジェクトが明らかにシングルトンである場合は、オブジェクトをグローバル変数に割り当てることもできますが、それは非常に政治的に間違った答えです。)

于 2010-08-26T22:37:01.240 に答える