为了账号安全,请及时绑定邮箱和手机立即绑定

尝试处理iOS中的“后退”导航按钮操作

/ 猿问

尝试处理iOS中的“后退”导航按钮操作

iOS
慕虎7371278 2019-09-21 15:36:20

我需要检测用户何时单击导航栏上的“后退”按钮,以便在发生这种情况时执行一些操作。我正在尝试通过以下方式手动将操作设置为此类按钮:


[self.navigationItem.backBarButtonItem setAction:@selector(performBackNavigation:)];


- (void)performBackNavigation:(id)sender

{

   // Do operations


   [self.navigationController popViewControllerAnimated:NO];

}

我首先将该代码放在视图控制器本身中,但是我发现它self.navigationItem.backBarButtonItem似乎是nil,因此我将相同的代码移至了父视图控制器,从而将前者推入了导航堆栈。但是我都无法使它工作。我已经阅读了有关此问题的一些帖子,其中一些帖子说选择器需要在父视图控制器上进行设置,但是对我来说它仍然无法正常工作……我在做什么错?


谢谢


查看完整描述

3 回答

?
慕斯卡3215842

尝试使用以下代码使用VIewWillDisappear方法来检测是否按下了NavigationItem的“后退”按钮:


-(void) viewWillDisappear:(BOOL)animated

{

    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) 

    {

        // Navigation button was pressed. Do some stuff 

        [self.navigationController popViewControllerAnimated:NO];

    }

    [super viewWillDisappear:animated];

}

或还有另一种获取导航按钮的操作的方法。


为后退按钮的UINavigationItem创建自定义按钮。


例如:


在ViewDidLoad中:


- (void)viewDidLoad 

{

    [super viewDidLoad];

    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style:UIBarButtonItemStyleBordered target:self action:@selector(home:)];

    self.navigationItem.leftBarButtonItem=newBackButton;

}


-(void)home:(UIBarButtonItem *)sender 

{

    [self.navigationController popToRootViewControllerAnimated:YES];

}

斯威夫特:


override func willMoveToParentViewController(parent: UIViewController?) 

{

    if parent == nil 

    {

        // Back btn Event handler

    }

}


查看完整回答
反对 回复 2019-09-21
?
慕慕森

迅速

override func didMoveToParentViewController(parent: UIViewController?) {

    if parent == nil {

        //"Back pressed"

    }

}


查看完整回答
反对 回复 2019-09-21
?
万千封印

也许此答案不适合您的解释,但不适合您的标题。当您想知道何时点击上的后退按钮时,此功能很有用UINavigationBar。


在这种情况下,您可以使用UINavigationBarDelegate协议并实现以下方法之一:


- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item;

- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item;

当didPopItem方法被调用,那是因为你要么挖后退按钮,或者你使用[UINavigationBar popNavigationItemAnimated:]方法和导航栏确实流行的项目。


现在,如果您想知道是什么动作触发了该didPopItem方法,则可以使用标志。


使用这种方法,我不需要手动添加带有箭头图像的左栏按钮项即可使其类似于iOS后退按钮,并且能够设置我的自定义目标/操作。


让我们来看一个例子:

我有一个具有页面视图控制器和自定义页面指示器视图的视图控制器。我还使用自定义UINavigationBar来显示标题,以了解我在哪一页上,以及使用“后退”按钮返回上一页。而且我还可以滑动到页面控制器上的上一页/下一页。


#pragma mark - UIPageViewController Delegate Methods

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {


    if( completed ) {


        //...


        if( currentIndex > lastIndex ) {


            UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"Some page title"];


            [[_someViewController navigationBar] pushNavigationItem:navigationItem animated:YES];

            [[_someViewController pageControl] setCurrentPage:currentIndex];

        } else {

            _autoPop = YES; //We pop the item automatically from code.

            [[_someViewController navigationBar] popNavigationItemAnimated:YES];

            [[_someViewController pageControl] setCurrentPage:currentIndex];

        }

    }


}

因此,我实现了UINavigationBar委托方法:


#pragma mark - UINavigationBar Delegate Methods

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

    if( !_autoPop ) {

        //Pop by back button tap

    } else {

        //Pop from code

    }


    _autoPop = NO;


    return YES;

}

在这种情况下,我使用shouldPopItem了该按钮,因为该弹出窗口具有动画效果,并且我想立即处理后退按钮,而不要等到转换完成。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信