UIAlertView,从个人角度来讲,认为苹果所提供的使用delegate,而将一个对话框的处理拆分为上下文的方式,并不是一个很好的方 案。很多时候,会复杂化程序以及处理逻辑,而一堆的if-else或者switch-case也是很烦人的一件事情。所以,很多开发者对它动手脚。
如果你需要找的是,能够优美的处理不同的UIAlertView按键事件,那么你可以参考林家男孩的这篇博客。
但是,如果你想找的是模态对话框的功能,你可以参照一下以下的内容。
很多时候,我们只是需要一个模态对话框,让用户选择是或者否,让代码继续下去。去写上下文分支,真的是个很麻烦的事情,尤其是假如你的应用需要按照 某种顺序,根据第一个UIAlertView的选择结果决定弹出第二个甚至更多的UIAlertView。所以,我希望能有个模态的 UIAlertView,在我把它show出来之后,它就卡在那儿,直到给我返回一个值,告诉我它点了哪个按钮。
UIAlertView其实是具备模态功能的,只是苹果并没有开放出来,属于undocumented api,使用它很有可能被拒于AppStore之外。
它的私有API是这个:-[UIAlertView(Private) setRunsModal:]
怎么使用这个API我就不介绍了,大家可以上网查。事实上,在iPhone刚出来的时候,大家还是很经常使用这个API的。
这儿我要介绍的是另一种使用方法。
要想实现UIAlertView的模态效果,其实是比较简单的,无非是让它被show之后,代码能够停留在那空转,直到它被点击。
需要空转的时候,就是NSRunLoop/CFRunLoop出场的时候了。NSRunLoop/CFRunLoop的作用,请参考官方文档。很多时候我们都要用到它,尤其是在线程中使用网络和定时器的时候。
底下简单列出我的解决方案:
1 @interface MyModalAlertView : UIAlertView 2 - (int)showModal; 3 @end 4 5 #import "MyModalAlertView.h" 6 @implementation NdGHModalAlertView 7 8 - (int)showModal 9 { 10 self.delegate = self; 11 self.tag = -1; 12 [self show]; 13 CFRunLoopRun(); 14 return self.tag; 15 } 16 17 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 18 { 19 alertView.tag = buttonIndex; 20 alertView.delegate = nil; 21 CFRunLoopStop(CFRunLoopGetCurrent()); 22 } 23 24 @end
其实它的实现思路很简单,就是在show之后,让代码空转,然后在点击按钮之后,停止空转,并返回按键值。
所以,使用上述代码,你可以获得一个简单的模态对话框,用UIAlertView一样的初始化方法,调用自定义的showModal,而不是系统的show,通过返回值来确定它所按下的按键。
后记:
其实这个类两年前就写好了,一直没有决定放入项目使用,直到今年,终于受不了了,把它加入了工程。
转自:http://kensou.me/blog/?p=282