一、咱们先把前面的内容捋一下——省市选择界面: 1.首先呢,我们说,实现一个案例,第一步,先看界面, 1)第一步:先看界面, 2)第二步:分析一下它的基本结构, 3)第三步:搭建界面, 4)第四步:加载数据, 5)第五步:显示数据, 是不是五步, 大的就这五步, 但是这个搭建界面, 就一个PickerView,以及两个Label, 还用说吗, 不用吧, 这个很简单,我们直接过了啊, 2)然后,加载数据, 需要说吗, 不用吧,直接加载起来,一个数组, 这个数组里面,装的都是一些,字典, 然后呢,我们想把它转成模型, 那么,有人说,字典,我们为什么要把它转成模型, 是不是因为顺序的关系, 大家说一下啊,这个不是因为顺序的关系, 是因为,我们在写代码的时候,如果你不去转模型, 也没有任何问题, 它的顺序,还是这个,这里面写的是什么顺序,就是什么顺序, 但是,往下面再写, 这些内容,你取的时候,怎么取, 是不是通过Key去取的, 但是这个Key呢, 我们是不是@一个字符串儿, 有时候呢,现在我们是不是很少,所以呢,不出错,但是,如果它有十个二十个呢,是不是就不能保证每一次都写对啊, 所以呢,我们就去字典转模型, 这么一个原因, 为了保证我们每一次写的时候,直接“点儿”出来、“点儿”出来, 很方便的,可以保证我们写的正确性, 这个原因,所以去做这个字典转模型, 那,加载数据里面, 我们是不是直接把这个文件传进来,直接写成一句话了, 然后呢,加载成一个字典数组, 那紧接着呢,是不是遍历,转模型, 然后呢,转模型的过程中, 是不是通过类方法转,但是, 这个模型,你能不能直接添加到这个_provinces,里面, 我们这个数组,是不是不可变数组, 你不能往里面加东西的, 所以呢,先用一个临时数组, 把你转出的这些模型,保存起来, 然后,这个遍历,结束以后,是不是这个临时数组里面,保存的就是我们plist文件里面,所有的字典,转出来的模型,对吧, 然后呢,我们最后,把这个临时数组,交给我们的模型数组,然后呢,返回, 但是我们这里,说了一句话, _provinces = [arrM copy]; 这是不是有时候,也有人会这么写, copy一份儿,不可变数组,返回, //拷贝一份不可变数组交给模型数组 这么写,也是可以的, 只要知道,就好了, 因为有时候,别人可能会这么写, 我们看的时候,能看懂,就OK, 好,这是我们加载数据,做完了, 4)紧接着,是不是就要显示数据 显示数据,怎么做呢,第一步,你是不是得设置它的数据源、代理对象、 我们在哪儿设置的, 是不是直接在Main.storyboard,然后呢,右键, 两个属性,拖上去, 设置数据源、代理对象、我们前面TableView,是不是也是一样, 那、然后呢,在控制器里面,你是不是要遵守对应的协议, 也就是我们最上面,UIPickerViewDataSource、UIPickerViewDelegate 遵守完协议以后呢, 是不是实现数据源方法、代理方法、 数据源方法里面,这两个方法 是什么呢,是@required,必须要实现的, 1)numberOfComponentsInPickerView:但是呢,这个有多少组这里呢, 我们是不是直接写死的, 你不能根据这个数组,去返回吧, 我们这个模型数组里面,装的是一堆的模型, 根本没有那么多的组, 所以,你直接返回,就可以了, 2)numberOfRowsInComponent:component 然后呢,是每一组里面,有多少行, 这个,我需要给大家前面写一个://每组返回多少行吗 需要这样写吗,你是不是直接看这个就行了:numberOfRowsInComponent, numberOfRows:跟TableView里面,是一样一样的, 然后呢,这里面,我们就需要分情况了, 因为我们省市选择,跟我们点餐系统,一个区别,是什么, 它两组是有关系的,对不对, 所以,如果你是第0组, 怎么样呢,显示多少行,是不是你这个cities里面,有多少个, 有多少个省,你就显示多少行, 所以呢,我们直接返回那个模型数组的count,就可以了, 2)紧接着,城市,这一组, 显示多少城市, 你怎么去确定呢, 显示多少城市,你是不是首先得知道 你显示的是什么省, 只有这个省里面的城市,才是我们要显示的,对不对, 要是拿起它的省,行不行,