замена моего detailViewController в UISplitView дает сбой при вращении моего приложения Objective-C

У меня есть приложение SplitViewController с двумя начальными контроллерами:

  • leftViewController (мастер)
  • rightViewController (деталь)

мой rightViewController (деталь) имеет делегата splitViewController для представления кнопки, которая показывает/скрывает мое меню (мастер)

мой leftViewController (мастер) - это приложение меню, когда я выбираю любой элемент меню, я запускаю переход, связанный с моим мастером, и он заменяет мой 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

но все еще не работает... я получаю то же сообщение

Как это исправить???

заранее спасибо

EDIT: добавьте мой код перехода, чтобы помочь ответить на мой вопрос

-(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];

    }
}

person Jesús Ayala    schedule 20.09.2013    source источник
comment
Не могли бы вы показать код Segue?   -  person LuisCien    schedule 20.09.2013
comment
позвольте мне посмотреть, как я добавлю код в свой исходный пост   -  person Jesús Ayala    schedule 20.09.2013


Ответы (2)


Возможно, вам нужно передать своего делегата, как вы сказали, в свой newViewController... почему бы вам не добавить это в свой leftViewController (мастер)...

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

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

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

    }
}

просто замените идентификатор перехода (showNewViewControllerScene), чтобы он соответствовал вашему в раскадровке.

person Jesus    schedule 20.09.2013
comment
вау, это прекрасно работает, но я собираюсь дополнить ваш ответ, позвольте мне сказать это !!! благодарю вас - person Jesús Ayala; 20.09.2013

Собираюсь дополнить ответ Иисуса

Поскольку я работаю с несколькими переходами, все они должны иметь делегата моего UISplitView, а также, поскольку iPhone не поддерживает разделенные представления, я добавил условие для назначения делегата только в том случае, если пользователь запускает это приложение на любом 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];

    }
}
person Jesús Ayala    schedule 20.09.2013