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

iOS代理浅析2

    (2)SquareView里面加个button并加touch事件

    (3)写个代理,并设置SquareView为委托类

      代理方法为:

    - (void)buttonTouched

      @property (nonatomicassign)id<ButtonTouchedDelegate>delegate;

     (4)在button的点击事件里面设置其代理对象,为ViewController

    RootViewController *root = [[RootViewController allocinitWithNibName: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