当UINavigationBar(由UINavigationController控制)的后退按钮被点击时,如何弹出UIAlertView?在某些情况下,我想问用户“你确定吗?问题的类型,所以他可以中止动作并保持当前视图或弹出导航堆栈,并转到父视图.

我发现最吸引人的方法是在UINavigationBar的代理上覆盖ShouldPopItem().

现在,这里有一个很相似的问题:iphone navigationController : wait for uialertview response before to quit the current view

还有一些类似性质的其他问题,例如:
Checking if a UIViewController is about to get Popped from a navigation stack?
和How to tell when back button is pressed in a UINavigationControllerStack

所有这些状态“子类UINavigationController”作为可能的答案.

那就是这样一个读类似子类的UINavigationController一般不是一个好主意:
Monotouch: UINavigationController,override initWithRootViewController

apple docs还说UINavigationController不是要进行子类化的.

另外还有一些人声称,在使用UINavigationController时,不重要的ShouldPopItem()是不可能的,因为它不允许将一个自定义/子类的UINavigationBarDelegate分配给UINavigationBar.

我的子类化尝试没有工作,我的自定义代表不被接受.

我也读过某个地方可能会在我的自定义UINavigationController中实现ShouldPopItem(),因为它将自己指定为它的UINavigationBar的Delegate.

没什么惊喜,这没有办法. UINavigationController的子类如何知道属于UINavigationBarDelegate的方法.它被拒绝:“找不到适当的方法来覆盖”.删除“覆盖”关键字已编译,但该方法被完全忽略(如预期).我认为,使用Obj-C可以实现几个协议(类似于C#AFAIK中的接口)来实现.不幸的是,UINavigationBarDelegate不是一个接口,而是MonoTouch中的一个类,所以这似乎是不可能的.

我几乎在这里迷路了当UINavigationBar的代理由UINavigationController控制时,如何覆盖ShouldPopItem()?还有其他方法可以弹出一个UIAlertView并等待它的结果可能会弹出导航堆栈?

解决方法

这个帖子有点旧,但是如果你仍然对解决方案感兴趣(仍然涉及到子类化):

这实现了“你确定要退出吗?当按下后退按钮时发出警报,请从代码修改:http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller/

原来,如果您在CustomNavigationController中实现UINavigationBarDelegate,可以使用shouldPopItem方法:

CustomNavigationController.h:

#import <Foundation/Foundation.h>

@interface CustomNavigationController : UINavigationController <UIAlertViewDelegate,UINavigationBarDelegate> {

BOOL alertViewClicked;
BOOL regularPop;
}

@end

CustomNavigationController.m:

#import "CustomNavigationController.h"
#import "SettingsTableController.h"

@implementation CustomNavigationController


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

if (regularPop) {
    regularPop = FALSE;
    return YES;
}

if (alertViewClicked) {
    alertViewClicked = FALSE;
    return YES;
}

if ([self.topViewController isMemberOfClass:[SettingsTableViewController class]]) {
    UIAlertView * exitAlert = [[[UIAlertView alloc] initWithTitle:@"Are you sure you want to quit?" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Yes",nil] autorelease];

    [exitAlert show];

    return NO;

}   
else {
    regularPop = TRUE;
    [self popViewControllerAnimated:YES];
    return NO;
}   
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
    //Cancel button
}

else if (buttonIndex == 1) {    
        //Yes button
    alertViewClicked = TRUE;
    [self popViewControllerAnimated:YES];
}           
}

@end

“regularPop”bool的奇怪的逻辑是因为某些原因只是在shouldPopItem上返回“YES”只会弹出导航栏,而不是与navBar关联的视图 – 为此,您必须直接调用popViewControllerAnimated(然后调用shouldPopItem为其逻辑的一部分)

UINavigationController和UINavigationBarDelegate.ShouldPopItem()与MonoTouch的更多相关文章

  1. 使用UINavigationController进行iOS 7自定义当前转换

    解决方法我有同样的问题,并解决了在设置此框架之前将toViewController添加到容器.反转如下的行:

  2. iOS – UINavigationController,隐藏navigationBar

    快速以及obj-c的答案非常受欢迎编辑:我试过以下各种版本,问题依然存在–.-编辑2:打印:在viewDidLoad返回20之后解决方法更新:只需在ViewDidLoad方法中添加它即可

  3. ios – Xcode 6 – Swift – 带导航的自定义标签栏

    谢谢.解决方法我将尝试从架构角度指导您.使用UITabBarController为了达到你的建议,你是对的,你不能马上使用UITabBarController,有几个原因,最直接的一个是它们总是在底部,你想要它在顶部.好消息是,你可能不需要它!

  4. ios – UINavigationController自定义动画可防止滑动返回工作

    我注意到一些奇怪的东西,可能是UINavigationController中的一个错误.当你覆盖-navigationController:animationControllerForOperation:fromViewController:toViewController:并返回nil(对于默认的动画行为),拖放回去的手势不再有效.此方法的文档说明如果要使用标准导航控制器转换,则应返回“nil”

  5. ios – 状态栏大小错误,包含UINavigationController

    这是你永远不应该做的事情.只需将这些行添加到您的代码中:现在导航控制器的视图有一个框架,并相对于其超视图维护它.

  6. ios – 如何在Swift中的Alert中为按钮添加动作

    设置断点并调试代码.您没有设置alertView的委托.

  7. 如何在警报视图IOS中创建两个文本字段

    =========工作解决方案===========感谢下面的答案,当你只需要两个纯文本字段时解决方法分配“消息”警报视图后.将其添加到您的代码中:这将使您的警报视图内部有两个文本字段.

  8. ios – 在Obj-C中使用Switch语句

    下面是一个Switch/Case语句,当无法发送电子邮件时显示错误消息.在大多数情况下,一切似乎都是正确的,但是当我将UIAlertView放入Switch语句时,我在Xcode中收到错误:为什么在将代码放入案例时会产生错误?解决方法把它放在括号中:

  9. ios – 在呈现UINavigationController模式时,segue.destinationViewController为nil

    我有一个UICollectionView,当用户按下一个单元格时,我使用一个故事板以模态方式呈现UINavigationController中的另一个视图控制器.现在,我的问题是segue.desinationViewController返回nil(如代码片段中的注释所示).只是为了调试,我将UINavigationController更改为另一个视图控制器,我没有问题.我不知道是否从modal更

  10. “边缘抗锯齿渲染”导致iOS 7中的UIAlertView延迟

    自从iOS7以来,我注意到我的UIAlertViews显示有一种绘图延迟–屏幕变暗,UIAlertView的文本在出现警报视图的实际帧之前就会在屏幕上出现一秒钟.我追溯到这个问题是由于我的应用程序plist文件中的“边缘抗锯齿的渲染”标志设置为YES.关闭这个解决了这个问题.任何人都知道我可以吃我的蛋糕吗?解决方法“边缘抗锯齿渲染”非常昂贵!谨慎使用.使用这个小技巧:

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部