0

次のように、プログラムで UINavigationBar に UISegmentedControl を追加しています

UISegmentedControl *toggleSwitch = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"Bar", @"Scatter", nil]];
toggleSwitch.segmentedControlStyle = UISegmentedControlStyleBar;
[toggleSwitch addTarget:self action:@selector(toggleSwitched:) forControlEvents:UIControlEventValueChanged];

UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:toggleSwitch];
self.navigationItem.rightBarButtonItem = buttonItem;
[toggleSwitch release];
[buttonItem release];

次に、イベントを処理するためのメソッド、toggleSwitched があります。

-(void) toggleSwitched:(id) sender {
    if([sender isKindOfClass:[UISegmentedControl class]]) {
        NSLog(@"%@",((UISegmentedControl*)sender).selectedSegmentIndex );
    }
}

Apple Documentationを読んだところ、これはタッチ イベントのイベント処理を設定する適切な方法です。

ただし、プログラムを (シミュレーターで) 実行してセグメントをタップすると、次のことが起こります。

  1. 最初のセグメント (インデックス 0) の場合、「null」がコンソールに記録されます
  2. 2 番目のセグメント (インデックス 1) の場合、プログラムは EXC_BAD_ACCESS でクラッシュします。

デバッガーの変数ウィンドウを見ると、sender は UISegmentedControl 型で、_selectedSegment プロパティは正しい (0 または 1) ようです。

私は何に不適切にアクセスしていますか? UISegmentedController の 2 つの値を切り替えるようにデリゲート関数を設定するにはどうすればよいですか?

4

1 に答える 1

2

あなたNSLogは間違っています。selectedSegmentIndexを返すので、代わりにNSUIntegerを使用する必要があります。はオブジェクト用であるため、システムはその番号をオブジェクトを指すメモリ アドレスとして使用しようとし、エラーを生成します。@"%d"@"%@"%@

于 2012-07-02T18:04:47.087 に答える