iOS代理浅析2
昨晚,做一个类似啪啪的试图切换demo, 又TM掉代理坑里了。。。
1,需求:啪啪主页的左右半拉视图切换。
2,设计:一个ViewController上有三个子view(A, B, C,不包括ViewController.view), 其中A上有个button,ViewController需要获取button的点击事件并改变A,B,C三个vew的frame
3,实现过程:
(1)ViewController里面加入三个view
(2)SquareView里面加个button并加touch事件
(3)写个代理,并设置SquareView为委托类
代理方法为:
- (void)buttonTouched
@property (nonatomic, assign)id<ButtonTouchedDelegate>delegate;
(4)在button的点击事件里面设置其代理对象,为ViewController
RootViewController *root = [[RootViewController alloc] initWithNibName:nil bundle:nil];
self.delegate = root;
[self.delegate buttonTouched];
(5)在ViewController里面实现代理方法,并且修改三个View的frame
- (void)buttonTouched {
CGRect frame = self.squareView.frame;
frame.origin.x = 280;
self.squareView.frame = frame;
CGRect rect = self.leftView.frame;
rect.origin.x = 0;
self.leftView.frame = rect;
}
4,出现的问题:frame无法改变,难道是因为frame只能在主线程里面修改的原因?(不是的)
5,解决方案,button的点击事件里面ViewController的初始化去掉,也就是不指定delegate的代理对象,在ViewController里面初始化SquareView对象的时候,指定SquareView的delegate对象为self,并实现代理方法即可。
6,问题出现的原因:点击的时候初始化ViewController对象,并指定其为代理对象。这个时候,ViewController上的三个view只是创建了,并没有渲染,也就是说,代理方法执行的时候,三个view并没有进行渲染,所以无法改变三个view的frame.
7,总结:要特别注意代理方法跟试图渲染的执行顺序。
转载于:https://my.oschina.net/u/616092/blog/127280