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

"Cancel" button (UIBarButtonItem) not working in iOS view controller

提问人:Piyush Khanna 提问时间:9/3/2022 最后编辑:Piyush Khanna 更新时间:9/5/2022 访问量:128

问:

我正在尝试以编程方式在视图控制器的导航栏中添加一个“取消”按钮。该按钮的唯一用途是关闭当前视图控制器并返回到根视图控制器。我正在使用以下 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 UIVieviceController UINuageController RootViewController

评论

0赞 The Dreams Wind 9/3/2022
您能否添加工作目标函数的实现,以便我们可以尝试发现使其工作的差异?
0赞 Piyush Khanna 9/5/2022
添加了有效的 onTapCancel 函数(基本上只打印日志行)。如果我添加用于关闭视图控制器的代码,则该函数将停止工作,并且不会打印任何日志。

答:

1赞 The Dreams Wind 9/5/2022 #1

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

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

如果您以模式方式呈现控制器(从第一个代码片段开始,我假设控制器也用导航控制器包装),那么只需关闭它:

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