昨晚,作一個相似啪啪的試圖切換demo, 又TM掉代理坑裏了。。。 atom
1,需求:啪啪主頁的左右半拉視圖切換。 spa
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爲委託類 事件
代理方法爲: it
- (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,總結:要特別注意代理方法跟試圖渲染的執行順序。