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

我猜应用程序崩溃是因为您试图取消引用 smallNSInteger作为指针。

重写:

- (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 回答