模态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.  
  3. - (int)showModal; 
  4.  
  5. @end 

 

  1. #import "MyModalAlertView.h" 
  2.  
  3. @implementation NdGHModalAlertView 
  4.  
  5. - (int)showModal 
  6.     self.delegate = self; 
  7.     self.tag = -1; 
  8.     [self show]; 
  9.     CFRunLoopRun(); 
  10.     return self.tag; 
  11.  
  12. - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
  13.     alertView.tag = buttonIndex
  14.     alertView.delegate = nil
  15.     CFRunLoopStop(CFRunLoopGetCurrent()); 
  16.  
  17. @end 

其实它的实现思路很简单,就是在show之后,让代码空转,然后在点击按钮之后,停止空转,并返回按键值。

所以,使用上述代码,你可以获得一个简单的模态对话框,用UIAlertView一样的初始化方法,调用自定义的showModal,而不是系统的show,通过返回值来确定它所按下的按键。

 

后记:

其实这个类两年前就写好了,一直没有决定放入项目使用,直到今年,终于受不了了,把它加入了工程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章