前言
- block实在是很强大的神器,回调的时候常常觉得这也行,真的很爽
- 在写项目的时候遇到了block为空的问题,解决下来感觉对block的理解加深了很多
Block的构成
- Block可以看作由两部分组成,一个是定义,调用,另一个是回调内容
- 我们用block实现回调,本质上就是回调内容是写在前面的,但是我们实际调用是写在后面,这样子一个时间差就能帮我们做很多事情
我遇到的问题
项目问题
- 我遇到的情况大概来说是要在一个ViewController上写了一个ViewA,而A上一个button点击后会出现新的ViewB,ViewB上有一个UIPickerView,而设置PickerView的Delegate和datasource都要设置在ViewController上
- 而由于ViewB依附于ViewA建立,如果我们在初始化ViewA的时候就在ViewController里设置Delegate和datasource,由于那个时候PickerView还不存在,设置了也没什么用
- 所以我希望的是,能够在PickerView初始化完的时候再进行设置,而在View的实现文件里无法点出ViewController了
用Block解决
- 因此这就是一个我最近遇到很好的能通过block回调特性解决的问题,因为回调的存在,我们可以将回调内容写在ViewController刚初始化ViewA的时候,而实际调用放在后面ViewB上的UIPickerView已经初始化完毕的时候
然鹅
- 然而,显然并没有那么顺利的好事,在写的时候,我发现我的block回调是空的
- 此时就是blcok中很常见的一个错误,回调内容没有写在调用前面
- 因为我把blcok的调用直接写在重写的init方法里面,而为了使用这个block属性,我们先得保证View2已经初始化出来了,而按照我的写法此时block已经被调用了,这就使得blcok显示为空
解决
- 解决方案就是把block调用和UIPickerView放出来写个单独的方法,在我们已经写完回调之后再初始化pickerView以及调用block
- 这也可以总结下一般我们遇到问题时应该怎么办,就是一步一步设端点,找什么为空,找到为空的那个,解决这个问题