2012-10-08 15 views
1

我有一個分段控制器(兩個段),它位於彈出窗口中。我的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); 
} 
+1

爲什麼'(NSInteger的*)'? – Cfr

+0

沒有它,我不斷收到一個指向NSInteger類型轉換錯誤的指針,所以我決定嘗試將它作爲NSInteger進行類型轉換。 – LightMan

回答

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); 
} 

我猜的應用程序崩潰,因爲你正在嘗試取消引用小NSInteger作爲一個指針。

改寫:

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

    NSInteger newAudioMessageChoiceIndex = editorVC.audioMessageChoice.selectedSegmentIndex; 

    editorVC.audioMessageChoice.selectedSegmentIndex = newAudioMessageChoiceIndex; 
} 

你們是不是要設置selectedSegmentIndex與它自己的價值?在委託方法中設置popover的委託沒有意義。

如果你想保留酥料餅的會話之間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; 
} 
+0

非常感謝您的建議!爲了得到這個編譯,我必須在prepareForSegue方法中插入我的原始代碼的前五行。正如你猜測和建議的,我把 – LightMan

+0

我試圖做到這一點,但新選擇的部分沒有被保留,並顯示爲選擇下一個彈出呼叫。你能告訴我該怎麼做嗎?我很感謝你在這裏的耐心,因爲我是這個iOS的新人,並且有很多東西需要學習。 – LightMan

+0

你有'@ synthesize'd'audioMessageChoiceIndex'屬性嗎? – Cfr