“取消”按钮(UIBarButtonItem)在 iOS 视图控制器中不起作用

问题描述 投票:0回答:1

我正在尝试以编程方式在视图控制器的导航栏中添加“取消”按钮。该按钮的唯一目的是关闭当前视图控制器并返回到根视图控制器。我使用以下 Objective-C 代码来实现此目的:

UIBarButtonItem* cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(onTapCancel:)];
self.controller.navigationItem.leftBarButtonItem = cancelBtn;
self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.controller];
[self.navigationController setNavigationBarHidden:NO animated:YES];

取消按钮功能:

-(void)onTapCancel:(UIBarButtonItem*)item{
    NSLog( @"Cancel button Tapped");
    UIViewController *rootViewController = [
      [[UIApplication sharedApplication] keyWindow] rootViewController];
    [rootViewController dismissViewControllerAnimated:YES completion:nil];
}

当我只有一个日志行而不是关闭当前视图控制器的代码时,onTapCancel 函数被调用,没有任何问题。但是,当添加关闭视图控制器的代码(onTapCancel 函数中的第 2-4 行)时,该函数将停止被调用(我什至没有在日志中看到“取消按钮已点击”日志行)。可能的原因是什么?

在 onTapCancel 函数中使用时,以下代码有效(每次点击取消按钮时都会打印日志行):

-(void)onTapCancel:(UIBarButtonItem*)item{
    NSLog( @"Cancel button Tapped");
}

谢谢!

ios objective-c uiviewcontroller uinavigationcontroller rootviewcontroller
1个回答
1
投票

仔细查看您的代码后,我现在可以看到您尝试关闭应用程序的根控制器。它本身没有任何意义,因为根控制器是不可解雇的,你只能替换它。如果您尝试关闭的控制器位于导航控制器堆栈中,则弹出到根视图控制器应如下所示:

- (void)onTapCancel:(UIBarButtonItem *)item {
    [self.navigationController popToRootViewControllerAnimated:YES];
}

如果您以模态方式呈现控制器(并且从第一个代码片段来看,我假设控制器也包含导航控制器),那么只需将其关闭即可:

- (void)onTapCancel:(UIBarButtonItem *)item {
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}
© www.soinside.com 2019 - 2024. All rights reserved.