模态UIAlertView

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

posted @ 2012-07-10 20:25  ValeTu  阅读(354)  评论(0编辑  收藏  举报