2016-03-09 21 views
0

我有一個UIViewController(cardView)有一個視圖計數器。有一個按鈕,「菜單」,在右上角打開一個單獨的UIViewController(cardsViewer),列出所有不同的卡片並作爲模式打開。針對特定的UIViewController實例重複UIViewsControllers

在cardsViewer內部,您可以單擊列表中的某個按鈕,並覆蓋同一類型的UIViewController(cardView)的模式,並顯示相同的視圖計數器,但不是「菜單」按鈕,而是具有「返回鍵。

問題是,當我去到cardView的新實例,如果它與原始實例相同,則查看計數器在cardView的第二個實例上更新,但是當您退出到原始cardView並且發送它(通過委託函數)更新的viewCount,它不刷新刷新標籤。

我甚至有委託功能打印視圖計數,顯示它被接收,但它不會對視圖做任何事情。即使視圖的第二個實例被解散但第一個仍不更新,也會發生這種情況。

這幾乎就像我一做第二個實例,就不能再修改第一個實例的UI。我用派遣獲得主隊列和所有這些,但它是無濟於事。

幫助!

+1

您需要顯示一些代碼;看起來你沒有保持對視圖控制器實例的正確引用。 – Paulw11

+0

@ Paulw11呃哦,我應該保留一些第一個參考? – simplexity

+2

視圖控制器與數組或字典或任何其他對象沒有區別。你可以有多個實例,你需要在適合iOS的短時間內參考合適的實例 – Paulw11

回答

1

下面是每個請求的簡單示例。

在我的應用程序中,我使用音頻播放器來傳輸遠程音頻文件。和一個UITabBarController舉行並提出我的看法。我在我的SongsViewController中有歌曲的桌面視圖。當一行被點擊時,有兩件事發生...... 1)用戶界面延伸到一個新的視圖控制器,我的NowPlayingViewController和2)撥打我的ControllerClass,它處理從指定的URL獲取歌曲,並開始播放。我需要我的ControllerClass的代表爲NowPlayingViewController,這樣當歌曲完成加載時,我可以發送更新到NowPlayingViewController上的UI。所以,裏面的SongsViewController我這樣做的didSelectRowAtIndexPathMethod ...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    //get a reference to the NowPlayingViewController, and set it as the delegate to the ControllerClass 

    let nowPlayingVC = NowPlayingViewController() 
    ControllerClass.delegate = nowPlayingVC 
    self.tabBarController.selectedIndex = 1 
} 

BUT!當ControllerClass執行其代表回撥到NowPlayingVC時,UI上沒有任何事情發生!在我的頭撞在牆上後...我發現原因不起作用是因爲: 當一首歌被點擊時,標籤欄控制器正在呈現一個NowPlayingViewController的實例,它已經有一個引用。當一首歌被點擊時,我還會抓住另一個參考NowPlayingViewController,然後我使用該實例(參考)設置爲我的ControllerClass的代表。這是一個問題,因爲我的標籤欄控制器所保存的NowPlayingViewController的實例是NowPlayingViewController的不同實例,而不是我引用並設置爲我的ControllerClass的代理的實例。這意味着當ControllerClass去回調到NowPlayingViewController時,它會回調到與標籤欄控制器提供的實例不同的實例!因此,我沒有看到像他們應該發生的任何UI變化。

在我的情況下,因爲我使用的是UITabBarController我能夠做到這一點......

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    //find the instance of the NowPlayingViewController that is being presented, the one that i am VIEWING and set that instacne as the delegate to the ControllerCLass 

    let nowPlayingVC = self.tabBarController?.viewControllers![1] as! NowPlayingVC 
    ControllerClass.delegate = nowPlayingVC 

} 

通過訪問被保持的標籤欄內,該視圖控制器,我能夠抓住到NowPlayingViewController這是正被呈現的一個,並且因此ControllerClass,在調用的相同的實例的引用回到它的代表,正確地回撥到由標籤欄控制器呈現的NowPlayingViewController的實例。

我假設你沒有使用UITabBarController,但你的解決方案仍然是引用你的VC的SAME實例,並確保在這兩個地方使用這個實例!只要確保引用SAME實例。

+0

感謝@MikeG,瘋狂的好解釋。非常感謝!我只需要消化它,並得到類似的東西在我的。將我更新一次! – simplexity

+0

非常歡迎,請花時間,讓我知道如果有什麼不清楚我很樂意幫助您解決您的問題!我自己對iOS開發非常陌生,所以我知道它是什麼樣子!在紙上畫出這對我來說是一個巨大的幫助,我強烈推薦它。這是一個漫長的解釋,但它真的很簡單,如果你可以直觀地看到它 – MikeG

+1

更新:@MikeG,你的想法使我在正確的方向如何處理參考。雖然我沒有完全按照你所做的,但它幫助我將方法存儲在一個結構中,並在需要時調用它。謝謝! – simplexity