Отклонить modalViewController не удаляет модальный вид

#iphone #objective-c #uitabbarcontroller

#iPhone #objective-c #uitabbarcontroller

Вопрос:

Я выяснял это со вчерашнего дня, но пока не понял, что правильно. Я добавил modalviewcontroller для моего контроллера представления загрузки поверх моего контроллера панели вкладок, и он отлично работает. Добавлен код в делегат приложения:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:  (NSDictionary *)launchOptions { 
   [navController.navigationBar setTintColor:[UIColor blackColor]]; 
   [window addSubview:rootController.view]; 
   [window makeKeyAndVisible];
   LoadingViewController *lvc = [[LoadingViewController alloc] initWithNibName:@"LoadingView" bundle:nil]; 
    // Delegate added here
   lvc.loadingDelegate = self;
   [rootController presentModalViewController:lvc animated:YES]; 
   [self URL]; 
   [lvc release]; 
   return TRUE; 
}
  

Теперь я выполняю свой синтаксический анализ, и когда он завершен, я вызываю следующий код в другом представлении с именем XMLParsingView.m, где синтаксический анализ завершен.

 - (void)handleLoadedApps
 {
 LoadingViewController *loading = [[[LoadingViewController alloc] init] autorelease];
 //delegating to let the load view controller know to dimiss itself by defining  disappear method in protocol
 [loading.loadingDelegate disappear];
 }
  

и при загрузке контроллера представления у меня есть метод, который вызывает dismissModalViewControlAnimated:

  -(void)disappear{
[activity stopAnimating];
[activity removeFromSuperview];
[self removeFromSuperview];
[self dismissModalViewControllerAnimated:YES];
}
  

Но по какой-то причине он никогда не удалит представление и не загрузит его обратно в мой контроллер панели вкладок.
Здесь действительно нужна помощь, если кто-либо сталкивался с такими проблемами.

Саго

Ответ №1:

В вашем коде вы, кажется, создаете, без указателя, новый LoadingViewController и сразу же идете и отклоняете его. В делегате вашего приложения вы создаете свой первый loadingViewController с помощью кончика, модально представляете его в RootController, а затем выпускаете его. Поскольку вы хотите отклонить его вне вашего делегата приложения, у вас есть

3 варианта (от самого сложного до самого быстрого и наиболее разумного)

a) Наблюдение за ключом-значением в свойстве XMLParsingView из LoadingViewController, чтобы удалить себя после завершения задачи.

б) Используйте делегирование, чтобы сообщить LoadingViewController, когда задача завершится, чтобы закрыть себя.

c) Извлеките ваш RootController из вашего [делегата [UIApplication sharedApplication]], что означает, что вы должны предоставить RootController как свойство или с помощью метода и заставить RootController отклонить ваш модальный.

Комментарии:

1. @tsakoyan: Я отредактировал свой ответ выше с помощью вашего варианта b. Но все же это не помогает мне удалить контроллер модального вида. Я делаю это правильно, кстати?

2. LoadingViewController * загрузка происходит из ниоткуда, ее не следует использовать, когда я имел в виду делегирование, это было что-то вроде xmlParsingViewInstance.loadingDelegate = lvc; внутри вашего делегата приложения… тогда внутри XMLParsingView — (void)исчезнет {[self.loadingDelegate didFinishTask];}, однако я рекомендую (c) myapp_delegate *appDel = [делегат общего приложения UI]; [appDel.RootController dismissModalViewController анимирован: ДА];

3. Спасибо, брат!!! Ты потрясающий человек!!! Я бился головой последние 6 часов!!!! Проблема заключалась в том, что я не использовал опцию C и все это время выдавал мне ошибки. myapp_delegate *appDel = [делегировать [UIApplication sharedApplication] делегата]; [appDel.RootController dismissmodalviewcontrollerанимирован:ДА];

4. @tsakoyan: Последний запрос: Когда я пишу приведенный выше код, modalviewcontroller появляется после загрузки панели вкладок, что означает, что мы можем разглядеть, что он поступает снизу в виде другого вида. Как избежать этого, показав его сразу после заставки, а затем загрузив панель вкладок?

5. сделайте lvc переменной класса, предоставьте ее как свойство, чтобы вы могли получить к ней доступ / выпустить ее позже: lvc = [[Загрузка… выделить] …]; [окно добавляет SUBVIEW:lvc.view]; [окно вставляет SUBVIEW:RootController.view в INDEX:0]; а затем в любом месте, где завершается задача [appDel.lvc.view removeFromSuperview]; appDel.lvc = nil;

Ответ №2:

Вам нужно вызвать dismissModalViewControllerAnimated на rootViewController , а не на контроллер загрузочного представления.

Комментарии:

1. Вызванный -(void) исчезает{ [self.LoadingController dismissModalViewControllerAnimated:YES];} Но все равно он не удалит его.

2. Вам не нужно вызывать его в RootViewController. Он должен работать, вызывая его в самом viewcontroller.

3. Джейми: Это работает не так, как я написал в своем основном вопросе по приведенному выше коду. Вы думаете, я что-то не так делаю?

4. @Jamie Технически это работает, но вы должны вызвать его на родительском: «Родительский контроллер представления отвечает за отклонение контроллера модального представления, который он представил с использованием метода presentModalViewController: animated:».

5. Я попытался удалить модальное представление через родительский контроллер представления, который является моим контроллером панели вкладок, а также через загрузочный контроллер представления, но все еще не могу удалить контроллер модального представления. Можете ли вы действительно помочь мне, на какие проблемы мне следует обратить внимание подробнее?