Используя комбинированный режим контроллера и навигационный контроллер в качестве корневого контроллера окна просмотра поочередно



У меня есть навигационный контроллер, который является корневым контроллером представления моего приложения. это мой главный экран. У меня есть контроллер split view, главный вид которого отображает местоположение, а детальный вид показывает местоположение на карте. Я хотел подтолкнуть контроллер split view к навигационному контроллеру, но он выдал ошибку, сказав, что контроллер split view не может быть подтолкнут к навигационному контроллеру, и это должен быть корневой контроллер представления приложения.
Поэтому я старался изо всех сил.



MyAppDelegate *myappdelegate= [[UIApplication sharedApplication] delegate];
UISplitViewController * vc= [[UISplitViewController alloc] init];
vs.viewControllers = [NSArray arraywithObjects......
....
myappdelegate.window.rootViewController= vc;


Это работает. Это показывает разделенные контроллеры вида без анимации, как и ожидалось. И я делаю те же шаги, когда я закрывал split view controller. я создаю навигационный контроллер с пером главного экрана и устанавливаю это окно делегата моего приложения.снова rootviewController.
И он успешно загружает главный экран снова.



Но я подозреваю, что это правильный путь достижения этой цели. Есть ли более приемлемый способ сделать это?

И я не мог освободить дочерние контроллеры split view controller. я сделал а точка останова на моем методе выпуска дочерних контроллеров. его нельзя было поймать. Я предположил, что когда я устанавливаю корневой контроллер вида моего приложения в качестве навигационного контроллера, старый корневой контроллер вида (split view controller) должен быть выпущен вместе с его дочерними устройствами.
Затем я попытался ниже кода при закрытии split view controller.



UISplitViewController *oldviewcontroller= (UISplitViewController*) myappdelegate.window.rootViewController;
for (UIViewController *child in oldviewcontroller.viewControllers)
{
[child release];
}

//Setting the navigation controller as window.rootviewController again in here.


Этот код выдает ошибку " [UIImageView _ _ viewDidDisappear:]: нераспознанный селектор, отправленный в экземпляр 0x7d...."



Я думаю, что из-за освобождения взгляда уже нет imageview на событии viewdidDisappear.



Короче говоря, мой вопрос заключается в том, правильно ли я использую метод для достижения этой цели? Если да, то как я могу успешно освободить все дочерние контроллеры представления?
633   1  

1 ответ:

Я наконец нашел способ. Наверное, я нашел ошибку. Я только что срезал ветку, на которой сижу. Я выпускал контроллер вида, в котором я сейчас нахожусь:) Когда вызывается viewdidDisappear, такого контроллера вида нет. Потому что я уже выбрасываю его в космос.Ниже приведены мои рабочие шаги. Надеюсь, это кому-то пригодится. Но я не могу смириться с мыслью о том, что apple может отклонить мое приложение. Я желаю найти подходящий способ.

Это мой рабочий окончательный способ использования разделите контроллер вида и навигационный контроллер как контроллер корневого вида окна поочередно.

Сначала я определил свойство NavigationController и SplitViewController в интерфейсе AppDelegate.

AppDelegate.h
@property (assign,nonatomic) UINavigationController * NC;
@property (assign,nonatomic) UISplitViewController *SVC;

Во-вторых, я назначаю вновь созданный NC на событие AppDelegate didFinishLaunch.

AppDelegate.m
//Creating my main screen controller
//Creating my navigation controller with my view controller instance. Then
self.NC= my_navigation_controller;
self.window.rootViewController= self.NC;

В-третьих, создание контроллера splitview и настройка в качестве корневого контроллера вида приложения

 MyMainScreen.m
 -(void) OpenSplit()
 {
      //Creating my master view controller of SVC
      //Creating my detail view controller of SVC
      //Creating my SVC;
      AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate];
      app_delegate.SVC= newly created my SVC;
      app_delegate.window.rootViewController= app_delegate.SVC;          
 }

В-четвертых, высвобождение неиспользуемого NC в событии viewDidLoad детального представления ВПВ.

MyDetailView.m
- (void) viewDidLoad()
{
    ...
    AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate];
    app_delegate.NC= nil;  //i dont need it now. i am releasing. Releasing Navigation Controller release as well child controllers. I learned with testing.
}   
В-пятых, управление функцией close split view.Я использовал UIBarButton на NavigationBar в DetailView.
MyDetailView.m
-(void) closeSplitView
{
     //Creating navigation controller with my main screen view controller
     AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate];
     app_delegate.NC= newly_created_NC;
     app_delegate.window.rootViewController= appdelegate.NC;
} 

Обработка В-шестых неиспользованный контроллер сплит просмотреть в главном событии метод viewDidLoad экране.

 MyMainScreen.m
 -(void) viewDidLoad
 {
    AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate];
    app_delegate.SVC= nil; //I am releasing it because i am working with NC now.
 }

Comments

    Ничего не найдено.