2013-04-18 65 views
3

我是初學者objective-C。所以請原諒,如果我的問題是愚蠢的。如何將數據傳遞給ios中的父類?

在我root view controller A,我添加了一個subview B. B中就會有另一個subview C。 C包含另一個subview D。 如何在A from D中調用方法。 我知道我們可以使用代表將數據傳遞給parent controller。 但我的問題是,我是否需要創建代表調用C from D和另一個呼籲B from C等? 或者有什麼方法可以直接調用A from D中的方法嗎?

+2

更多關於你想要做什麼的背景會有所幫助。視圖實際上不應該以任何方式在視圖控制器中調用方法。 – rdelmar 2013-04-18 04:51:42

+0

當我從'D'初始化'A'時,所有的屬性都會初始化。所以我失去了價值。這是我的問題 – manujmv 2013-04-18 05:10:04

+2

B,C,D'UIView'或'UIViewControllers'? – viral 2013-04-18 05:15:48

回答

0

添加您A_viewCon.h文件到您的D_viewCon.h文件

創建對象的A_viewCon,並設置@property@synthesize爲正常。

調用A_viewCon的方法D_viewCon寫下面的代碼。

[self.objectOFA_viewCon performSelector:@selector(MethodNameOFA_viewCon) withObject:nil afterDelay:0]; 
+0

的問題是,當我們從D初始化一個A時,A的所有屬性也將初始化 – manujmv 2013-04-18 04:53:59

+0

@manujmv-那麼什麼?如果OP想把功能作爲他/她需要的話,那麼這不是一個壞主意.. :) – 2013-04-18 04:58:48

+0

@TheKing他是OP – viral 2013-04-18 05:14:32

2

我是否需要創建委託,從d,另一個用於呼叫B,從C等調用C? 沒有

您可以使用一個單一的委託,從D.調用一個方法從你的意見,我認識了B,C,d是的UIView的控制,你的根視圖控制器。所以這項工作很簡單,您需要在創建每個子視圖時將委託設置爲其根視圖控制器。
1.查看B從根視圖控制器本身,以便viewB.delegate =自創建
2.查看C從視圖乙所以viewC.delegate = self.delegate
3.重複相同創建查看D也

現在所有的意見都是由您的委託rootViewController控制。
最後This answer將幫助你完成你的任務

0

U可以註冊一個類來觀察NSNotification像 - >

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

,並從像d類的對象後NSNotifications - >

- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

這樣,你不需要保留一個參考/代表,仍然可以溝通活着的對象之間。

1

你應該構建你的代碼,以便D類根本不知道類A是否存在。

有跡象表明,在IOS/Mac的編程是常見的一些具體技術:

  • 類d具有代表性質,並在其上調用方法。當只有一個對象可以接收委託方法時使用它,對於像按鈕這樣的事情特別有用,詢問它現在應該被啓用還是禁用。使用接口生成器將視圖的代理設置爲A類實例。
  • D類應該具有「目標」屬性(類型爲id)和「操作」屬性(類型爲SEL),並且它將發送操作消息/選擇器到目標對象。當視圖具有觸發的特定單個操作時(例如按下按鈕時,或者用戶在文本字段中按Enter)時非常有用。使用界面構建器將視圖的目標和操作設置爲A類實例。
  • D類向[NSNotificationCenter defaultCenter]發送消息和元數據,而A類告訴通知中心它希望觀察這些通知。在發生某些事情時需要通知可能有多個對象時很有用,例如當文本字段接收或放棄鍵盤焦點時。
  • 當屬性的值發生更改時,D類有一個或多個屬性發送Key Value Observing通知。 A類會告訴Key Value Observing系統,只要D類上的特定屬性發生變化,它就會知道它。當您專門關注某些數據時,如文本字段的值發生更改時,這非常有用。

所有這些技術在堆棧溢出或Apple官方文檔中都有更詳細的描述。

B類和C類也不應該知道A類存在。類A應該是知道如何查找其他對象的類,除非您可以使用界面構建器(前兩個選項允許)。

3

但我的問題是,我是否需要創建從D調用C和從C調用B的另一個委託等?

視圖控制器的工作是管理它的視圖和所有視圖的子視圖。如果你有一個需要向視圖控制器發送消息的視圖,比如當用戶改變它的值時需要發送消息的控件,那麼視圖控制器應該知道它在那裏。

- (void)viewDidLoad 
{ 
    self.needControl.delegate = self; 
} 

通過這種方式,有需要的控制:在這種情況下,作爲所述子視圖的委託或目標時視圖層次結構被加載,這樣視圖控制器可以採取設置本身(或一些其它適當的對象)的護理不需要知道任何有關它的代表的對象。它並不假定對象是視圖控制器,它的父視圖或其他任何東西。所有它關心的是它有一個委託,並且它的委託實現了必要的方法。反過來,這又可以幫助您保持代碼更加靈活和可維護,甚至可以重用。

相關問題