并且一个更严重的问题是,动画运行完,就停止了。而loading动画应该是循环的,在查阅了文档及Animated源码之后,没有找到类似loop这种控制循环的属性,无奈之下,只能另辟蹊径了。
上文提到过,Animated动画的start方法可以在动画完成之后执行回调函数,如果动画执行完毕之后再执行自己,就实现了循环,因此,将动画封装成函数,然后循环调用本身就可以了,不过目前动画还只把高度变矮了,没有重新变高的部分,因此即使循环也不会有效果,动画部分也需要修正:
现在在player对象的play方法里,我们可以通过代理属性调用 playerDidStartPlaying:方法,任何使用Player类的对象,可以遵守代理协议,就可以实现自定义的playerDidStartPlaying:方法了,player类依然保持它的通用性和独立性,方便为对外提供服务。代理是非常强大技巧,苹果本身就经常使用。像 UITextField 这样的类,有时候你还会想把几个不同的方法分组到几个单独的协议里,比如UITableView —— 它不仅有一个代理(delegate),还有一个数据源(dataSource)。
现在,让我们回顾程序本身,只进行基本操作是不够的,为了进行有现实意义的操作,我们需要对操作的过程进行流程控制。流程控制中最基本的就是条件执行,也就 是说,某些操作只能在某些条件满足的情况下才执行,在一些条件下执行某种操作,在另外一些条件下执行另外某种操作。这与交通控制中的红灯停、绿灯行条件执行是类似的。
在index.jsp中设置验证码,用户点击验证码时,调用js代码请求服务器得到新的验证码。因为上面的那个生成验证码的servlet会被浏览器缓存,所以js代码中需要给该servlet一个随机的参数,这样浏览器就会向服务器发请求得到新的验证码,而不是去缓存中读取。