2009-08-24 17 views
10

カスタムUITableViewCellRootLabeledSwitchTableCellというサブクラス)内にUISwitchがあります。カスタムUITableViewCell内のUISwitchが利用できません

このセルには、隣にUILabelUISwitchが含まれています。

私はこのカスタムセル内のスイッチを指すkeychainSwitch呼ば@property持っている:

:私のテーブルビューのデリゲートで

@interface RootLabeledSwitchTableCell : UITableViewCell { 
    IBOutlet UILabel *textLabel; 
    IBOutlet UISwitch *labeledSwitch; 
} 

@property (nonatomic, retain) IBOutlet UILabel *textLabel; 
@property (nonatomic, retain) IBOutlet UISwitch *labeledSwitch; 

@end 

を、私は、スイッチの状態が反転された場合に呼び出されるセレクタを追加しました

- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *CellIdentifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]]; 
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     switch (indexPath.section) { 
     case(kMyFirstSection): { 
      switch (indexPath.row) { 
       case(kMyFirstSectionFirstRow) { 
        [cellOwner loadMyNibFile:@"RootLabeledSwitchTableCell"]; 
        cell = (RootLabeledSwitchTableCell *)cellOwner.cell; 
        self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch]; 
        [self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched) forControlEvents:UIControlEventValueChanged]; 
        break; 
       } 
       // ... 
      } 
     } 
     // ... 
    } 
} 

だから、このセレクタは正しく動作:

- (void) keychainOptionSwitched { 
    NSLog(@"Switched keychain option from %d to %d", ![self.keychainSwitch isOn], [self.keychainSwitch isOn]); 
} 
は何もしないように -setOn:animatedを引き起こしている nilあり、テストから

- (void) updateInterfaceState { 
    BOOL isFirstTimeRun = [[[NSUserDefaults standardUserDefaults] objectForKey:kIsFirstTimeRunKey] boolValue]; 
    if (isFirstTimeRun) { 
     [self.keychainSwitch setOn:NO animated:NO]; 
    } 
} 

が、私はまだスイッチとNSLog文を操作することができます:3210

はしかし、私はその初期状態を初期化するためにUISwitchインスタンスの-setOn:animated:メソッドを使用することはできません正しく例えば、スイッチ状態の変更を表示します:

[Session started at 2009-08-24 07:04:56 -0700.] 
2009-08-24 07:04:58.489 MyApp[29868:20b] keychain switch is: nil 
2009-08-24 07:05:00.641 MyApp[29868:20b] Switched keychain option from 1 to 0 
2009-08-24 07:05:01.536 MyApp[29868:20b] Switched keychain option from 0 to 1 
2009-08-24 07:05:02.928 MyApp[29868:20b] Switched keychain option from 1 to 0 

は、私はUITableViewデリゲートメソッドでself.keychainSwitchの設定について行方不明です何かはありますか?

答えて

5

私はしばらく前にこれをしませんでした。 あなたが

-(void) keychainOptionSwitched:(id)sender { 
UISwitch *tempSwitch = (UISwitch *)sender; 
} 

に更新し、あなたの方法をあなたのselctor

[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched:) forControlEvents:UIControlEventValueChanged]; 

を変更しなければならない今、tempSwitchが変更されたスイッチです。

+1

これは私の最後には機能しませんでした。しかし、提案をありがとう。 –

+1

ここでもうまくいきませんでした。私は:[OptionsViewController toggleImage]:インスタンス0x4b305c0 'に送られた認識できないセレクタ。パラメータがなくてもそれを呼び出すことができたことに注意してください(私は明らかにどのスイッチがそれを呼んでいるのかわかりませんでした)。 – Julian

+1

これはうまくいきました。セレクタコールにコロンを含めるためにターゲットアクションを追加するときは必ず確認してください!これは@selector(keychainOptionSwitched :)で動作しますが、これは@selector(keychainOptionSwitched)ではありません。 – Julian

0

ここで起こっていることは、セルが表示されていないときに操作を呼び出そうとしていることだと思います。そのときにセルがアンロードされ、キーチェーンスイッチがなくなり、一度それが見えたら、それは再ロードされて以来、もはやゼロではありません。しかし、私はあなたがそう

self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch]; 

その表のセル内のスイッチへの参照などのスイッチを割り当てるとするとき、セルスイッチは、以来、ゼロになってきているので、それが作るので、あなたが、それを保持していないことを確認します見えなくなって、キーチェーンスイッチがアンロードされ、その結果、クラスメンバーもゼロになっています。 keychainSwitchを保持しておき、テーブルを再構築するときにスイッチをkeychainSwitchなどから取り出すことができます。これが役に立ちますようにお願いします。

+0

self.keychainSwitch = [[(RootLabeledSwitchTableCell *)細胞labeledSwitch]保持]。動作しません。 –

+0

あなたはおそらくプロパティをとにかく保持しています...あなたは上記のような発疹を発症するとどうなりますか? – Daniel

+0

さらに、keychainSwitchインスタンスを持つセルを含む-updateInterfaceStateメソッドを呼び出すと、すべてのテーブルビューセルが表示されます。 –

70

シンプルなラベルを付けてカスタムUITableViewCellsを使いこなしていましたが、私が発見する前にそれをスイッチしました。アクセサリビューとしてUISwitchを追加できました。とにかくこれを知っているでしょうし、他の理由でカスタムセルを欲しがっていますが、私はこれについて言及したいと思っています! (:cellForRowAtIndexPathメソッド-tableViewで):次のように

あなたはこれを行う

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease]; 
cell.accessoryView = mySwitch; 

accessoryViewビットも私たちはCGRectZeroで逃げることができますサイズと位置の世話をします。

[(UISwitch *)cell.accessoryView setOn:YES]; // Or NO, obviously! 
[(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector) 
    forControlEvents:UIControlEventValueChanged]; 

希望に役立ちます:

あなたはその後、次のようにシステム制御イベントとシートンメソッドを使用することができます(私たちはそれを知っているUISwitchポインタとしてそれをキャストに注意)!

+1

はい、私は知っていますアクセサリービュー。私はこの特定のケースでカスタムセルを使用したいと思いますが、ありがとう! –

+11

[cell addSubview:mySwitch];必要ない。 cell.accessoryViewはmySwitchを保持します。 –

+0

私はあなたに投票しましたが、単純投票では「ありがとう」のようには思えませんでした。ありがとう!時には手元の問題に集中することがありますが、私はフレームワークのこの小さな補足事項を忘れていました。 –

関連する問題