- (void)viewDidLoad
{
// set the left bar button to a nice trash can
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash
target:self
action:@selector(confirmCancel)];
[super viewDidLoad];
}
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex)
{
// The didn't press "no", so pop that view!
[self.navigationController popViewControllerAnimated:YES];
}
}
- (void)confirmCancel
{
// Do whatever confirmation logic you want here, the example is a simple alert view
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning"
message:@"Are you sure you want to delete your draft? This operation cannot be undone."
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes", nil];
[alert show];
}
要从iOS获得确切的按钮pngs,我推荐UIKit Artwork Extractor。在运行项目并将图像保存在iPad Retina模拟器和iPad非视网膜模拟器上后,在将出现在桌面上的模拟器文件夹中的“Common”文件夹中查找标题。文件名“UINavigationBar... Back(@2x).png”和“UINavigationBar... BackPressed(@2x).png”是您想要的。 为了方便起见,我还附上了上面代码中使用的default iOS (iPhone and iPad) back bar button pngs。请注意,随着iOS的更新,默认后退按钮项的外观可能会发生变化...
let tap = UITapGestureRecognizer(target: self, action: #selector(onBackPressed(gestureRecognizer:)))
tap.cancelsTouchesInView = true
self.navigationController?.navigationBar.addGestureRecognizer(tap)
cancelsTouchesInView = true确保后退按钮不会获得触摸事件。
手势处理:
@objc func onBackPressed(gestureRecognizer: UITapGestureRecognizer) {
guard gestureRecognizer.location(in: gestureRecognizer.view).x < 100 else {
return
}
// ... back button is pressed do what you wanted to
8条答案
按热度按时间3z6pesqy1#
不幸的是,你不能以这种方式拦截后退按钮。最接近的传真是使用您自己的
UIBarButtonItem
设置为navigationItem.leftBarButtonItem
,并设置一个操作来显示您的警报等。我有一个平面设计师创建按钮图像,看起来像标准的后退按钮。顺便说一句,我需要拦截后退按钮是出于另一个原因。我强烈建议您重新考虑这个设计选择。如果你展示的是一个用户可以进行更改的视图,并且你希望他们可以选择保存或取消,恕我直言,最好使用“保存”和“取消”按钮,而不是带警告的后退按钮。警报通常很烦人。或者,明确用户正在进行的更改是在他们进行更改时提交的。那这个问题就没意义了
b09cbbtk2#
我如何解决这种情况是通过将
leftBarButtonItem
设置为UIBarButtonSystemItemTrash
样式(使其立即明显,他们将删除草稿项)并添加一个确认删除的警报视图。因为你设置了一个自定义的leftBarButtonItem
,所以它不会像一个后退按钮一样,所以它不会自动弹出视图!在代码中:
就这么简单!我看不出有什么大问题,tbh:p
不过,我得加上一个免责声明;这样做会破坏默认的导航行为,苹果可能不喜欢开发人员这样做。我还没有提交过任何有这个功能的应用程序,所以我不确定苹果是否会允许你的应用程序在商店里使用,但要注意;)
am46iovg3#
实际上,您可以找到Back按钮视图并将UITapGestureRecognizer添加到其中。
如果你看这张图片:
使用以下代码:
您可以了解如何找到返回按钮的视图。它总是导航栏子视图数组中的最后一个。
所以我用了:
点击后退按钮,瞧:
5tmbdcev4#
试试这个解决方案:
我在iOS 11和iOS 13上测试了它,它运行得很好:)
kkih6yb85#
我想出了一个简单的解决方案,开箱即用:
1.)您需要创建一个自定义导航控制器:
2.)将以下代码添加到所有需要确认“PopRequiresConfirmation”的ViewController:
2vuwiymt6#
下面是你需要做的,以轻松地制作一个自定义后退按钮,复制iPhone和iPad上默认后退按钮的外观,并显式地编写代码,因为我想我会在某个时候再次来到这里寻找它。
将以下函数放在带有UINavigationController的相关UIViewController的实现(.m)文件中的某个位置,然后在viewDidLoad中运行
[self setupBackButton];
无论你想对后退按钮做什么,都可以输入
backButtonPressed
函数。要从iOS获得确切的按钮pngs,我推荐UIKit Artwork Extractor。在运行项目并将图像保存在iPad Retina模拟器和iPad非视网膜模拟器上后,在将出现在桌面上的模拟器文件夹中的“Common”文件夹中查找标题。文件名“UINavigationBar... Back(@2x).png”和“UINavigationBar... BackPressed(@2x).png”是您想要的。
为了方便起见,我还附上了上面代码中使用的default iOS (iPhone and iPad) back bar button pngs。请注意,随着iOS的更新,默认后退按钮项的外观可能会发生变化...
nbewdwxp7#
下面是一个解决方法:(在iOS10和11上测试)
在导航栏中添加点击手势识别器:
cancelsTouchesInView = true确保后退按钮不会获得触摸事件。
手势处理:
而不是使用100作为魔术数字,你可以找到包含后退按钮的视图,并使用它的框架来检测触摸。
vs91vp4v8#
很简单。只要用一个透明的UI控件覆盖按钮并捕捉触摸。
这个方案也适用于tabBar按钮,但是确定位置要复杂得多。