2010-09-30 16 views
0

對於iOS開發,如果您在運行時創建並添加子視圖,您將如何允許它與視圖控制器進行通信?由於子視圖未在nib內實例化,因此無法使用Interface Builder將連接拖至控制器上的IBAction方法。我看不到一個顯而易見的方式從視圖中獲取控制器的句柄。或者我以錯誤的方式看待它,而應該通過NSNotificationCenter間接與它進行溝通?運行時創建的子視圖如何與視圖控制器進行通信?

+0

事實證明,這與今天早些時候提出的另一個問題完全相同。但是,*問題的標題完全是誤導性的,直到我現在編輯它爲止。 – bbum 2010-09-30 21:20:51

回答

0

回答我自己......我是從父視圖中創建這些子視圖所以沒有訪問控制器有兩種,所以從其他答案的代碼示例self是不可能的。但是在考慮了一下之後,我決定將代碼移入控制器本身,但是選擇使用委託而不是目標操作,因爲這是一種自定義消息,而不僅僅是一個簡單的觸摸事件。感謝那些幫助過的人。

0

你想溝通什麼? IBActions是預先定義好的(或者是新定義的,如果你想要經歷添加UI元素到IB的麻煩)UI元素可以在某些交互時觸發某個選擇器,因爲這樣可以始終以編程方式產生相同的效果...例如,以在運行時創建一個UIButton你可以做..

UIButton *button=[[UIButton alloc] initWithFrame:frame]; 
    [button addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:button]; 

任何東西,你可以在Interface Builder中你可以做的編程方式,以及...你只需要尋找將結合行動方法UI元素...希望這有助於。

看完你的評論: 你可以考慮從視圖控制器而不是視圖創建按鈕,可能是正確的方法來做到這一點(不知道你的情況,但)...如果不是,那麼無論是視圖可以處理事件並使用協議將事件委託給視圖控制器,或者您可以使用協議作爲UI元素的目標註冊,解決問題的方法有很多,您的情況如何?

+0

好的,我意識到我遺漏的關鍵細節。這些子視圖是從另一個視圖創建的,而不是從控制器本身創建的。所以在那個時間點沒有可用的控制器。這是否會改變你的答案? – Marplesoft 2010-09-30 21:26:02

0

大多數視圖不直接與視圖控制器通信。相反,它們連接到IBOutlet,或者它們使用target-action在視圖控制器上調用方法。

對於前者,只需像通常那樣聲明一個IBOutlet屬性,並在創建視圖後對其進行設置。 (請注意,從技術上說,你不需要因爲你沒有將在IB連接的IBOutlet中的關鍵字,但我不認爲這會傷害任何東西。)

self.myViewOutlet = myNewView; 

如果你的UIView的是UIControl一個子類,使用addTarget: action: forControlEvents:可以在控件上發生某些事件時調用視圖控制器的方法。

[myNewControl addTarget:self action:@selector(mySelector:) forControlEvents:UIControlEventTouchDragInside]; 
相關問題