【问题标题】:ios How do I know the controller is a "push" or "pop" returnedios 我怎么知道控制器是“push”还是“pop”返回
【发布时间】:2012-11-05 05:19:22
【问题描述】:

我有三个控制器,我想知道控制器是推送还是弹出

控制器:

{
    if(!b)
     b = [B alloc] init];
    [self.navigationController pushViewController:b animated:YES];
}

B 控制器:

- (void) viewDidAppear:(BOOL)animated 
{
     [super viewDidAppear:animated];
     //I want here to judge, from the "A" push over, or to return from the "C" "pop"

     //if it is push from A 
     //dosomething.....


     //if it is pop from C
     //dosomething
}
-(void)testAction:(id)sender
{
    C *c = [[C alloc] init];
    [self.navigationController pushViewController:b animated:YES];
    [c release];
}

C 控制器:

{
    [self.navigationController popViewControllerAnimated:YES];
}

谢谢。

【问题讨论】:

  • 没看懂,请多解释一下
  • 我已经解决了我的问题。可以吗?

标签: ios pushviewcontroller viewdidappear popviewcontroller


【解决方案1】:

看看 UIViewController 方法,isMovingToParentViewController。如果视图控制器因为被推送而被显示,这将返回 YES,但如果因为另一个视图控制器从堆栈中弹出而显示,则返回 NO。

-(void)viewDidAppear:(BOOL)animated { //Code in view controller B
    [super viewDidAppear:animated];
    NSLog(@"isMovingToParentViewController: %d",self.isMovingToParentViewController);
    // this will log 1 if pushing from A but 0 if C is popped
}

【讨论】:

  • @zt9788,我已经测试过了,它确实有效。您是否将方法放在 viewDidAppear:animated: 方法中?那就是它所属的地方。
【解决方案2】:

编辑:

Add UINavigationControllerDelegate in .h file

也这样做:

[self.yournavController setDelegate:self];

下面的方法是navigation controller delegate,当导航控制器shows通过push、pop或settingview controller stack的top view controller时调用。

添加这个方法

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{

}

【讨论】:

  • 对不起。当C弹出到B的控制器时,导航控制器不起作用,而我使用A推B时,导航控制器的功能也不起作用。为什么?
  • 谢谢,我修好了。我有一个 baseController,我使用 self.navigationController.delegate = self;在 viewDidLoad 中,它在 A 推 B 时有效,但在 C 弹出 B 时无效。---我采取 -(void)viewDidAppear:(BOOL)animated{self.navigationController.delegate = self;} 它有效。
【解决方案3】:

嗯,我认为您需要跟踪一个全局变量,该变量知道它是从 A 推送还是从 C 弹出。我会做的是:

  1. 在appDelegate或一些外部.h文件中声明一个BOOL变量isPush并合成它。

  2. 当您从 A 移动到 B 时,即这是一个推送,在 A 中使其等于“YES”。

yourAppDelegate *myDelegate = (yourAppDelegate*) [[UIApplication SharedApplication] delegate];

myDelegate.isPush = YES;

类似地,在从 C 中弹出之前,将值设为 isPush = NO;

  1. 在B的viewDidLoad中,查看变量的值。
yourAppDelegate *myDelegate = (yourAppDelegate*) [[UIApplication SharedApplication] delegate];

if(myDelegate.isPush)
//means A was pushed

else
//means C was popped

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2016-11-17
    • 2021-10-05
    相关资源
    最近更新 更多