1

ポップオーバーにあるセグメント化されたコントローラー (2 つのセグメント) があります。私の prepareForSeque メソッドは正常に動作し、正しいデフォルトの selectedSegmentIndex を返します。しかし、他のセグメントを選択してポップオーバーを終了すると、次のコード フラグメントに示すように、popoverControllerDidDismissPopover メソッドを実行するとアプリがクラッシュします。

私は何を間違っていますか?新しく選択したセグメントをセグメント化されたコントローラーに保持させたいのですが、それが popoverControllerDidDismissPopover メソッドの機能だと思いました。明らかに私の理解はここで間違っていますが、どこで?あなたが私に与えることができる助けを前もって感謝します。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   UIStoryboardPopoverSegue *popoverSegue;
   popoverSegue = (UIStoryboardPopoverSegue *)segue;

   UIPopoverController *popoverController;
   popoverController = popoverSegue.popoverController;
   popoverController.delegate = self;

   SettingsEditorViewController *editorVC;
   editorVC = (SettingsEditorViewController *)popoverController.contentViewController;
   audioMessageChoiceIndex = editorVC.audioMessageChoice.selectedSegmentIndex;
   NSLog(@"audioMessageChoiceIndex = %d", audioMessageChoiceIndex);
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    NSInteger *newAudioMessageChoiceIndex = (NSInteger *)((SettingsEditorViewController *)                     
        popoverController.contentViewController).audioMessageChoice.selectedSegmentIndex;

    popoverController.delegate = self;    
    SettingsEditorViewController *editorVC;
    editorVC = (SettingsEditorViewController *)popoverController.contentViewController;
    editorVC.audioMessageChoice.selectedSegmentIndex = *(newAudioMessageChoiceIndex);
}
4

1 に答える 1

0

あなたがここで何をしているのかわかりません:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    NSInteger *newAudioMessageChoiceIndex = (NSInteger *)((SettingsEditorViewController *)                     
        popoverController.contentViewController).audioMessageChoice.selectedSegmentIndex;

    popoverController.delegate = self;    
    SettingsEditorViewController *editorVC;
    editorVC = (SettingsEditorViewController *)popoverController.contentViewController;
    editorVC.audioMessageChoice.selectedSegmentIndex = *(newAudioMessageChoiceIndex);
}

NSIntegersmallをポインタとして逆参照しようとしているため、アプリがクラッシュすると思います。

書き換え:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    SettingsEditorViewController * editorVC = 
            (SettingsEditorViewController *)popoverController.contentViewController;

    NSInteger newAudioMessageChoiceIndex = editorVC.audioMessageChoice.selectedSegmentIndex;

    editorVC.audioMessageChoice.selectedSegmentIndex = newAudioMessageChoiceIndex;
}

selectedSegmentIndex独自の値で設定しようとしていますか? また、デリゲート メソッドでポップオーバーのデリゲートを設定しても意味がありませんでした。

ポップオーバー セッション間で状態を保持したい場合はUISegmentedControl、呼び出し元のプロパティに保持し、selectedSegmentIndex表示する前に設定します。

@property NSInteger audioMessageChoiceIndex;

@synthesize audioMessageChoiceIndex;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   /* ... */
   SettingsEditorViewController *editorVC = (SettingsEditorViewController *)popoverController.contentViewController;
   editorVC.audioMessageChoice.selectedSegmentIndex = self.audioMessageChoiceIndex;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    SettingsEditorViewController * editorVC = 
            (SettingsEditorViewController *)popoverController.contentViewController;
    self.audioMessageChoiceIndex = editorVC.audioMessageChoice.selectedSegmentIndex;
}
于 2012-10-08T14:44:49.980 に答える