在旋转我的应用程序Objective-C时,替换我在UISplitView中的detailViewController崩溃了

时间:2013-09-20 17:26:41

标签: ios objective-c uisplitviewcontroller ipad screen-rotation

我有一个带有2个初始控制器的SplitViewController应用程序:

  • leftViewController(master)
  • rightViewController(详细信息)

我的rightViewController(详细信息)有splitViewController的委托,用于显示显示/隐藏我的菜单的按钮(主)

我的leftViewController(master)是一个菜单应用程序,当我选择menú的任何元素时,我触发了一个连接到我的master的segue,它替换了我的detailViewController用于所选择的菜单元素

当我这样做并且如果我尝试将我的iPhone旋转为隐藏菜单时,我的应用程序崩溃并说:

*** -[rightViewController respondsToSelector:]: message sent to deallocated instance 

我想这是因为我的splitViewController想要与它的委托,旧的rightViewController进行通信,但它已经消失了,它已经在我的视图中被替换了,

也许我需要:

将我的委托重新分配给我的新viewController(详细信息) 要么  删除我的rightViewController的委托,然后将其分配给我的newViewController

也在我的新viewController中试过这个:

@interface newViewController ()<UISplitViewControllerDelegate>

@end

@implementation newViewController 


- (void)viewDidLoad
{

    UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController;
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
    splitViewController.delegate = (id)navigationController.topViewController;
}
...
@end

但仍然无法正常工作......我收到同样的消息

我该如何解决这个问题?

提前致谢

编辑:添加我的segue代码以帮助回答我的问题

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"viewSceneAgenda"]) {

        [segue.destinationViewController setTitle:@"Citas"];
        [segue.destinationViewController setUserIDElement:UID_CUS];
        [segue.destinationViewController setOverallAppointments:overallDates];

    }
}

2 个答案:

答案 0 :(得分:6)

也许你必须按照你对newViewController的说法传递你的委托...为什么不在你的leftViewController(master)中添加它......

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if ([segue.identifier isEqualToString:@"showNewViewControllerScene"]) {

        UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController;
        splitViewController.delegate = segue.destinationViewController;

    }
}

只需替换你的故事板上的segue标识符(showNewViewControllerScene)以与你的匹配

答案 1 :(得分:1)

要补充耶稣答案

由于我正在使用多个segue,所有这些都必须拥有我的UISplitView的委托,因为iPhone不支持splitviews,我添加了一个条件,用于分配代表,如果用户正在运行任何ipad公司

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{


    if ([[UIDevice currentDevice].model hasPrefix:@"iPad"]) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController;
        splitViewController.delegate = segue.destinationViewController;
    }

    if ([segue.identifier isEqualToString:@"viewSceneAgenda"]) {

        [segue.destinationViewController setTitle:@"Citas"];
        [segue.destinationViewController setUserIDElement:UID_CUS];
        [segue.destinationViewController setOverallAppointments:overallDates];

    }
}