4

このフォーラムのすばらしい投稿を使用して、tableView のアクセサリビューとしてスイッチを作成しました。スイッチに触れると、アクション (switchChanged) が呼び出されます。送信者のみが有効な値を持ち、イベントは 0x0 です。

switchView へのターゲットの追加:

        [switchView addTarget:self action:@selector(switchChanged:forEvent:) forControlEvents:(UIControlEventValueChanged | UIControlEventTouchDragInside)];

アクション:

- (void) switchChanged:(id)sender forEvent:(UIEvent *)event {
  if(event) {
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:self.tableView]];
    IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
    NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",[sender isOn],question.XmlAttrib);
    [self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];
  }
}

使用action:@selector(switchChanged: forEvent:)- スペースを追加 - 変更なし。

使用action:@selector(switchChanged::)- 削除forEvent- 認識されないセレクター。

私の目標は、tableView への indexPath を取得して、辞書の値を変更できるようにすることです。

私の現在の回避策は、送信者情報のみを使用することですが、イベント情報が必要です:

- (void) switchChanged:(id)sender forEvent:(UIEvent *)event {
    UISwitch *switchView = (UISwitch *)sender;
    UITableViewCell *cell = (UITableViewCell *)switchView.superview;
    UITableView *tableView = (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
    IFDFlightlogFormQuestions *question = [self.resultsController objectAtIndexPath:indexPath];
    NSLog(@"IFDNewFlightlogViewController_Pad:switchChanged Switch is %@ xmlAttrib %@",([sender isOn])?@"On":@"Off",question.XmlAttrib);
    [self.xmlResults setValue:([sender isOn])?@"true":@"false" forKey:question.XmlAttrib];        
}

これに関するイベント情報を取得するための指針はありますか?

4

3 に答える 3

6

@selectorにターゲットを追加することでトリガーすることができUISwitchます。

[switchCtl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
于 2013-12-21T01:10:53.303 に答える
2

もう 1 つの可能性は、UISwitch のタグ プロパティを設定して、テーブルビューの行と一致させることです。複数のセクションも使用する場合は、これらを単一の整数値にエンコードする解決策を考え出すことができます。このアプローチでは、セルが再利用されると行が変更される可能性があるため、セル (tableView:cellForRowAtIndexPath:) を更新するたびにタグを更新する必要があることに注意してください。

于 2011-06-02T16:19:24.583 に答える
0

残念ながらforEvent:、UIControl アクションからは何も送信されません...値が表示されないのは最初の部分だけです。

回避策が機能する方法は適切な方法です。

もう 1 つの方法は、UISwitch をサブクラス化して、NSIndexPath への参照を保持するか、オーバーライドすることです。

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

カスタムイベントを中断して送信するには...

于 2011-05-02T22:08:31.663 に答える