开发ios时经常用到UIAlertView类,该类提供了一种标准视图,可向用户展示警告信息。当用户按下按钮关闭视图时,需要用视图协议来处理此动作,但是,
要想设置好这个委托机制,就得把创建警告视图和处理按钮动作的代码分开。由于代码分作两块,所以读起来有点乱(更可怕的是一个控制器里面出现多个UIAlertView),比方说我们使用
UIAlertView时,都会这么写:
如果想在同一个类里处理多个警告信息视图,那么代码就会变得更为复杂,我们必须在delegate方法中检查传人的alertView参数,并据此选用相应的逻辑。要是能再创建警告视图时把处理每个按钮的逻辑都写好,岂不完美?这可以通过关联对象来做。创建完警告视图之后,设定一个与之关联的”块”(block),等到执行delegate方法时再将其读出来。方案如下:
以这种方式改下之后,创建警告视图与处理操作结果代码都放在一起了,这样比原来更容易读懂,我们无须在两部分代码之间来回游走了。但是采用该方案时要注意:块可能要捕获某些变量,也许会造成”保留环”。
下面来看另一种实现方式:
RAC为UIAlertView提供了- (RACSignal *)rac_buttonClickedSignal方法,此方法为警告框的按钮点击时间创建了一个signal.