UITableViewCell里UIButton实现push的代
TableView上面有多个HotTableViewCell,cell上面显示的是文字信息和一个详情Button,点击button以后push到一个新的页面。为什么说这个场景用到了代理delegate?因为button是在自定义的CustomTableViewCell上面,而cell没有能力实现push的功能,因为push到新页面的代码是这样的,
[self.navigationController pushViewController...];
所以这时候CustomTableViewCell就要委托它所在的Controller去做这件事情了。
按照我的编码习惯,我喜欢把委托的协议写在提出委托申请的类的头文件里面,现在的场景中是HotTableViewCell提出了委托申请,下面是简单的代码,
上面的代码在CustomTableViewCell.h中定义了一个协议HotTableViewCellDelegate,它有一个需要实现的pushToNewPage方法,然后还要写一个属性修饰符为weak(纠错:原来用的assign、名为delegate的property,之所以使用weak是因为这涉及到内存管理的东西,以后的博客中我会专门说明原因。
接下来在CustomTableViewCell.m中编写Button点击代码,
[self.detailBtnaddTarget:selfaction:@selector(btnClicked:)forControlEvents:UIControlEventTouchUpInside];
对应的btnClicked方法如下,
上面代码中的判断条件最好是写上,因为这是判断self.delegate是否为空,以及实现CustomCellDelegate协议的Controller是否也实现了其中的pushToNewPage方法。
接下来就是受到委托申请的类,这里是对应HotTableViewCell所在的ViewController,它首先要实现CustomCellDelegate协议,然后要实现其中的pushToNewPage方法,还有一点不能忘记的就是要设置CustomTableViewCell对象cell的delegate等于self,很多情况下可能忘了写cell.delegate = self;导致遇到问题不知云里雾里。下面的关键代码都是在ViewController.m中,
首先是服从HotTableViewCellDelegate协议,这个大家肯定都知道,就像很多系统的协议,例如UIAlertViewDelegate、UITextFieldDelegate、UITableViewDelegate、UITableViewDatasource一样。
还有一个步骤最容易被忘记,就是设置HotTableViewCell对象cell的delegate,如下代码,
通过cell.delegate = self;确保了CustomTableViewCell.m的判断语句if(self.delegate && ...){}中得self.delegate不为空,此时的self.delegate其实就是ViewController,cell对象委托了ViewController实现pushToNewPage方法。这个简单的场景描述了使用代理的一种情况,就是CustomTableViewCell没有能力实现pushViewController的功能,所以委托ViewController来实现。
由于做项目时间比较赶,借鉴了一下博主的文章
主要参考博主http://blog.csdn.net/a632407036/article/details/42968547
最后!欢迎加入iOS技术大群,学习知识交更多的同行朋友 QQ群号:580284575
QQ群二维码