這個問題是一個常見問題的變體:「如何在視圖控制器之間傳遞值」,並且您的代碼代表瞭解決方案的常見嘗試。讓我們從你所做的事開始。
你的應用程序有兩個視圖控制器和視圖堆棧中的視圖,並且你想在它們之間進行通信。這條線:
SecondViewController *theInstance = [[SecondViewController alloc] init];
創建SecondViewController的全新實例(ALLOC意味着這個類的一個新實例分配內存)。這條線:
[theInstance imageChange];
與它溝通的東西,在你的情況下,它看起來像設置圖像視圖的圖像。然後這條線:
}
隱含地銷燬該新實例,因爲它再也不會被再次引用。因此,您的代碼能夠成功地與SecondViewController進行通信,但是使用錯誤的實例,這個實例只能存活幾毫秒。
好的,該怎麼辦? @rmaddy說的是去找到SecondViewController的現有實例,並與之交流。如何獲得現有實例取決於我們如何到達這裏。代碼中的dismissViewControllerAnimated讓我認爲這個當前的vc是由SecondVC的一個實例提供的。如果是這樣,
(SecondViewController *)self.presentingViewController
指向你所需要的。如果我們是在一個UINavigationController
,你可以挖通這viewControllers
棧,大概在這裏:
NSArray *stack = self.navigationController.viewControllers;
SecondViewController *secondVC = stack[stack.count-2];
但是,儘管所有這可能是從A到B的直線條,這不是很好的設計,因爲它使這個電流視圖控制器依賴於如何呈現的脆弱方式。
因此@CrimsonChris提出了一個考慮委派的好建議。這是大多數人需要與另一個人交流的vc模式。關於如何做到這一點,有很多網絡和SO資源,所以我不會在這裏重複。 Check out this, for example,或谷歌「iOS代表團」。
還有其他一些方法,例如NSNotificationCenter
廣播給任何想要溝通的所有人,或者KVO讓SecondVC觀察模型中的變化並作出反應,無論該變化如何或爲何發生。
後兩者的關鍵概念是您的應用程序需要有一個模型,一組描述應用程序狀態的對象。視圖控制器不是模型 - 事實上它們不是,而是而不是模型。他們的工作是瞭解模型更改並相應地修改視圖。
對於您的情況,您發佈的代碼不應該試圖獲取其他視圖控制器中的圖像集,它應該記錄到模型中,無論發生什麼用戶操作都會觸發解僱。當這個vc自動解除時,SecondViewController(假設它現在)會得到一個viewWillAppear。該方法可能是檢查在用戶操作中設置的模型條件的好地方。然後SecondViewController可以自己調用imageChange。
希望已經夠清楚了。祝你好運。
您正在創建一個新的'SecondViewController'並更改其圖像。這沒有意義。您需要對現有的'SecondViewController'進行引用並更改其圖像。 – rmaddy
@rmaddy我應該更改哪些代碼? –
@ user3750491,它的變化不大:另外:SecondViewController是否提供了這個視圖控制器? – danh