2010-08-31 85 views
1

我有一個使用ui視圖的父視圖。這會在viewdidload上加載一個子視圖控制器。子視圖控制器上有一個按鈕,它可以在觸摸時連接到一個名爲clicked的子視圖控制器方法。父視圖 - >子視圖 - >按鈕 - >子視圖方法

這會導致訪問錯誤,導致應用崩潰並崩潰。我的問題是,這種設置是可能的還是必須在父視圖中有方法?子視圖將在8個不同的父視圖中加載,所以我想將該方法保留在子視圖中。

這樣做的正確方法是什麼?

+0

我認爲這將是張貼各地的崩潰相關的代碼是一個好主意。 – DarkDust 2010-08-31 18:05:52

+0

該方法運行時崩潰。該方法是空的,我想知道什麼是最好的做法,而不是代碼特定的。謝謝 – Skeep 2010-08-31 18:37:09

+0

任何設置都是可能的。崩潰是代碼特定的。 – 2010-08-31 18:43:36

回答

2

這種設置的好方法是有一個協議,包括點擊消息,包含按鈕的視圖中的id類型的委託屬性以及在同一視圖中激活委託消息的方法,如[self .delegate點擊]。 TouchUpInside事件鏈接到IB中的該方法,並且父視圖將其自身設置爲子視圖的委託並將其自身符合該協議。這聽起來有點棘手,但它絕對是正確的做法。

在子視圖的實現在子視圖界面

@interface viewWithButton { 
... 
id<viewWithButtonDelegate> delegate; 
} 
... 
@property (nonatomic, retain) id<viewWithButtonDelegate> delegate 
-(void)buttonClicked:(id)sender; 
... 
@end 

議定書

@protocol viewWithButtonDelegate 
    -(void)buttonClicked:(UIButton*)button inView:(UIView*)view; 
@end 

-(void)buttonClicked:(id)sender { 
    if([sender class] == [UIButton class]) { 
    [self.delegate buttonClicked:(UIButton*)sender inView:self] 
    } 
} 

控制器接口聲明如下

@interface myController<viewWithButtonDelegate> 

終於在控制器實現:

-(void)buttonClicked:(UIButton*)button inView:(UIView*)view { 
    //do something in response to button clicked 
} 

希望這有助於...