2014-08-28 4 views
0

В моем приложении IOS, пользователь прогрессирует через приложение, как так:IOS Определение Предыдущая View Controller

VC1> VC2> VC3

Я хочу, чтобы определить, если пользователь нажимает на кнопку назад от VC3 вернуться на VC2 и выполнить некоторый код, если пользователь это сделает. Я думал, что смогу сделать это в методе didMoveToParentViewController в VC2 и определить предыдущий контроллер представления, но он не возвращает правильный viewController (он возвращает VC1).

Каков наилучший способ для этого?

Это то, что я в настоящее время

-(void)didMoveToParentViewController:(UIViewController *)parent{ 
    NSLog(@"returned to VC2"); 
    NSInteger numberOfViewControllers = self.navigationController.viewControllers.count; 

    if(numberOfViewControllers >=2){ 
     // returned to view -> reload projects 
     NSLog(@"reloading projects from VC3"); 
     [self loadProjects:self.view]; 
    } 
} 
+0

Вы хотите выполнить код в VC3 по мере его выхода или когда вы вернетесь в VC2? – Paulw11

+0

И вы используете раскадровку? – Paulw11

+0

@ paulw11, когда я возвращаюсь обратно в VC2 – scientiffic

ответ

0

В файле "AppDelegate.h", утверждают, что вы реализуете протокол "UINavigationControllerDelegate":

#import <UIKit/UIKit.h> 

@interface AppDelegate : UIResponder <UIApplicationDelegate, UINavigationControllerDelegate> 

@property (strong, nonatomic) UIWindow *window; 

@end 

В "AppDelegate.m" file, override this method of the protocol:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([viewController isKindOfClass:[SecondViewController class]]) 
    { 
     // Insert the code here 
    } 
} 

В классе SecondViewController m ake свойство BOOL, которое вы установите на YES или NO, в зависимости от того, какой метод был выполнен или нет.

+0

Спасибо за помощь. Я попытался добавить ваше предложение к своим файлам AppDelegate, но кажется, что методы никогда не вызываются (я помещаю журналы для проверки). Должен ли он получать вызов каждый раз, когда пользователь переключает представления? – scientiffic

+0

Вам необходимо также установить свойство делегирования navigationController для себя внутри файла AppDelegate.m. Вы уже это сделали? – ppalancica

+0

нет, я еще этого не делал ... как мне это сделать? – scientiffic

1

Если вы используете раскадровку, вы можете использовать unwind segue.

В вашем VC2, добавить метод, такой как -

- (IBAction)unwindToVC2:(UIStoryboardSegue*)sender 
{ 

    //Whatever you need to do 
} 

Затем в раскадровку сцены для VC3, перетащите новую панель кнопок Пункт в левой части элемента навигации. Выберите кнопку - измените ее название на «Назад» или все, что вы хотите сказать, а затем перетащите его на зеленый значок «Выход» в нижней части сцены. Выберите «unindToVC2:», и все готово.

+0

спасибо за вашу помощь - это сработало для меня. но есть ли способ стилизовать кнопку панели, чтобы она выглядела как левая стрелка назад? – scientiffic

+0

Не легко к сожалению - http://stackoverflow.com/questions/3310454/creating-back-arrow-shaped-leftbarbuttonitem-on-uinavigationcontroller – Paulw11

+0

Я вижу ... но должен быть какой-то обратный вызов, когда пользователь нажимает на View Controller без настройки этой новой кнопки на панели! – scientiffic

0

Спасибо всем за ваш совет. В конце концов, я принял другой метод. Я создал булево, чтобы определить, был ли инициировало не конкретный переход:

BOOL reloadProjects; 

Это логическое значение установлено значение YES, когда переход называется. Затем, когда пользователь возвращается к просмотру, я перезагружаю проекты:

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:YES]; 
    if(reloadProjects == YES){ 
     [self loadProjects:self.view]; 
     reloadProjects = NO; 
    } 
} 
Смежные вопросы