2016-11-28 82 views
0

我是新的objective-c。我嘗試在2個視圖控制器(例如controllerA和controllerB)之間發送數據,但我不斷需要這些數據,因此我使用controllerB中的_displaylink從controllerA調用方法。我在控制器A中使用播放器,我想在控制器B中顯示時間等。如何獲得controllerA的現有實例?不斷在兩個視圖控制器之間傳遞數據iOS

我嘗試兩種不同的方式來做到這一點,但兩者創建視圖 - 控制

例1的新實例:

RootViewController *controller=(RootViewController *)self.presentedViewController; 

例子2:

RootViewController *parent=self.parentViewController; 

當我用這個解決方案我可以調用控制器A的方法(但是這是從新實例:()的方法:()

我也嘗試此解決方案:

RootViewController *rootController =(RootViewController*)[[(AppDelegate*) 
                   [[UIApplication sharedApplication]delegate] window] rootViewController]; 

但是當我嘗試調用的方法在我得到這個錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MMDrawerController playerPositionS]: unrecognized selector sent to instance 0x7c406c00'

任何想法如何調用此方法是否正確?

+1

兩者都不創建viewcontroller的新實例。 ControllerB是ControllerA的childViewController嗎?發佈一些代碼以查看控制器A + B之間的hirachie。 – shallowThought

+0

使用協議/委託 – Rajat

+0

ControllerB是在ControllerA – MaSza

回答

1

In MVC as implemented in iOS/Objective-C,視圖控制器指共享模型,而不是彼此連接。他們應該觀察該模型中的更改,然後相應地更新其UI。

一些方法來觀察變化:

  • KVO - 連接更改觀察者
  • Notification值傳遞給目標和選擇模式 - 允許模型「後」,它的改變和視圖控制器去「觀察」那些帖子。
  • Delegation - 這是最直接的(大多數過度使用,IMO)方法,其中一個對象提供了一些完善的界面(協議)的功能。
+0

中調用的模態我使用委託和通知,因爲我需要以兩種方式傳遞數據。謝謝你的幫助! – MaSza

0

只要你想修改的視圖控制器在導航堆棧中,我會嘗試這樣的事情來找到你想修改其屬性的視圖控制器。

let childVCs = UIApplication.shared.keyWindow!.rootViewController?.childViewControllers 
print("childvcs = \(childVCs)") 

let myVC = childVCs[0] 

let myOtherVC = childVCs[1] 

myVC.someProperty = 100 

myOtherVC.anotherProperty = 1000 
相關問題