2012-05-18 65 views
1
的內容

好吧我想網絡已經調用後刷新我的每一個標籤的標籤內容,和我已經試過洙許多不同的方法來做到這一點,我已經記不清了。有人可以告訴我這是可能的嗎?刷新TabView的

的網絡電話剛剛從服務器調用JSON,並使用它來更新標籤的內容。出於測試目的,我在設置類中設置了一個按鈕。 Settings類是主頁選項卡中的一個視圖,其中有一個名爲refresh的按鈕。單擊時,這會使設備上存儲的JSON與應用程序啓動時從Web調用中調用的設備不同。這節省了我不得不更改服務器上的JSON。

我將帶你通過一些我已經嘗試的技術和將不勝感激,如果有人能告訴我什麼,我做錯了。

我試圖使一個類的實例,並調用刷新方法就像在儀表盤類此

DashboardVC *db = [[DashboardVC alloc] init]; 
[db refreshMe]; 

的更新方法是這樣

-(void) refreshMe 
{  
    [self loadView]; 
    [self viewDidLoad]; 
} 

但是沒有運氣。如果我在Dashboard類中調用它,此方法將起作用,但如果我從另一個類調用該方法,則該方法不起作用。我認爲這是我正在實例化一個新類並調用刷新。所以我放棄了這種技術並轉向了下一個方法

這將循環遍歷所有tabBar並更改tabTitles而沒有任何問題,所以我知道它確實正確地循環ViewControllers。

我也嘗試過的觀點方法,如ViewDidAppear,viewWillAppear中等等,沒有運氣每個變體光盤。

我也試圖通過tabController訪問refreshMe方法我在儀表板類了這樣

[[[self.tabBarController viewControllers] objectAtIndex:0] refreshMe]; 

但同樣沒有運氣,這才導致我的應用程序崩潰。

我通過這個指南

https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerPGforiOSLegacy/TabBarControllers/TabBarControllers.html

蘋果網站上閱讀,但它似乎並沒有涉及如何刷新單個選項卡的內容。

所有我想要的是讓每個單獨的標籤刷新其內容的網絡電話作出後,並已花了年齡試圖弄清楚這一點,但沒有什麼工作。

所以會很感激,如果有人能告訴我什麼,我做錯了什麼?

Thanx提前....

編輯:

展開什麼我都試過

經過討論與邁克爾,我意識到你永遠不應該調用的loadView作爲對抗蘋果的準則。所以我刪除了對LoadView的任何引用。現在我已經在所有主ViewController中放置了一個名爲RefreshMe的方法,它可以在類中設置視圖,圖像文本等。而這個方法放在ViewDidLoad中。現在我希望能夠在網絡調用發生後調用這些方法,從而有效地刷新應用程序。

我的viewDidLoad現在在我所有的主類中都是這樣的。

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    [self refreshMe]; 
} 

然後refreshMe方法包含設置屏幕的代碼。

從網絡調用中提取的JSON數據將設置5個選項卡中的每個選項卡的內容,因此在Web調用之後需要刷新所有這些選項卡的內容。

我試着循環瀏覽viewControllers並調用viewDidLoad,它應該依次調用設置類的refreshMe方法,但是沒有任何反應。我使用的代碼是這樣的

NSArray * tabBarViewControllers = [self.tabBarController viewControllers]; 

for(UIViewController * viewController in tabBarViewControllers) 
{ 
    [viewController viewDidLoad]; 
} 

暫時我也包括

NSLog(@"Method called"); 

每個類的viewDidLoad中測試是否被調用它。但是,僅當我第一次加載應用程序時,或者如果我重新輸入應用程序,纔會打印出該消息。這個方法應該在設置屏幕中點擊刷新按鈕後調用,但不是,我不知道爲什麼。

任何人都知道爲什麼這不工作?

回答

1

從問題和您的意見,這聽起來像至少有兩個問題:

  1. 您無法訪問您的應用的標籤欄控制器管理的視圖控制器。

  2. 您似乎正在對視圖控制器的正常操作。

第一部分應該是直截了當的理清。如果您有指向對象的指針,則可以將消息發送到該對象。如果相應的方法沒有執行,那麼指針沒有指向你認爲它在做的地方,或者對象沒有你認爲它的方法。讓我們來看看你的代碼:

NSArray * tabBarViewControllers = [self.tabBarController viewControllers]; 

for(UIViewController * viewController in tabBarViewControllers) 
{ 
    [viewController viewDidLoad]; 
} 

此代碼應該調用每個一些標籤欄控制器管理的視圖控制器的-viewDidLoad。撇開這一點的智慧,我們可以說這個代碼應該按預期工作如果self.tabBarController指向你認爲它的對象。你不會說這個代碼存在於你的應用程序中 - 它是你的應用程序委託的一部分,是有問題的標籤欄控制器管理的一個視圖控制器的一部分,還是其他地方?使用調試器來遍歷代碼。在第一行之後,tabBarViewControllers是否包含視圖控制器的數組?視圖控制器的數量是否正確,它們是否是預期類型?如果您的視圖控制器的-viewDidLoad方法沒有被調用,那麼答案是「否」,這很好,所以找出爲什麼self.tabBarController不是您的想法。

現在,絕對值得指出(正如邁克爾所做的那樣),您不應該在第一時間致電-viewDidLoad。視圖控制器將在創建視圖後將該方法發送給自己(從.xib/storyboard文件加載它或以編程方式創建它)。如果你自己調用-viewDidLoad,它會在視圖創建之前運行,或者它會再次運行,這兩者都沒有幫助。

此外,嘗試「搶先」刷新每個視圖控制器的視圖沒有多大意義。如果您的應用程序正在從Web服務(或其他任何位置)檢索某些數據,則應使用結果數據更新其模型,即應用程序管理的數據對象。當選擇視圖控制器時,標籤欄控制器將顯示其視圖,視圖控制器的-viewWillAppear方法將在視圖顯示之前被調用。使用該方法從模型中獲取所需的數據並更新視圖。這樣做,這樣,你就知道:

  • 視圖控制器的視圖將已創建

  • 在視圖中顯示的數據是最新的,即使其他視圖控制器之一修改的數據

  • 你永遠不會花時間更新視圖,用戶可從來沒有在

看起來同樣,如果用戶可以對顯示的數據進行任何更改,您應該確保在更改模型時或者在視圖控制器的方法中更新模型,以便下一個視圖控制器可以使用正確的數據。

+0

tabBarController設置在appDelegate中。我檢查了self.tabBarController,它是得到5 viewControllers。我可以使用viewWillAppear進行刷新,但是我的主頁選項卡中有動畫,這意味着每次用戶選擇此選項卡時,動畫都會重置,並且看起來很奇怪。我只想讓動畫在第一次再次打開應用程序時運行,或者再次進行Web通話時運行。我會定期打電話給他。 – AdamM

+0

我也理解你關於預先加載的觀點,這有點奇怪。將切換到ViewDidAppear,但我只想阻止每次選擇標籤時運行的動畫 – AdamM

+1

您在控制 - 如果您不需要它們,請不要運行動畫。也許你在你的視圖控制器的初始化方法中設置了一個標誌,表示「應該運行動畫」,然後在運行一次後清除標誌。他們不應該再次運行,除非你殺了並重新啓動應用程序(否則你出於某種原因破壞並重新創建你的視圖控制器)。您的動畫問題不需要與刷新問題聯繫在一起。 – Caleb

1

而不是刷新您的視圖控制器時更新您的標籤欄排序,爲什麼不簡單刷新您的意見之前,他們將通過實施您的子類UIViewController的viewWillAppear:方法出現?

這意味着每當您的視圖即將出現時,您可以更新視圖以獲取新的&更新內容。

+0

但這意味着標籤會刷新他們的看法,每次我點擊它們,這不是一個低效率的方式嗎? – AdamM

+0

另一個問題是,我的主屏幕上有幾個動畫,這意味着每次點擊主屏幕選項卡時,動畫都會重新設置,看起來很奇怪 – AdamM

+1

It * may * be,取決於數據類型或你在視圖中顯示的信息(但是由於我沒有看到你的觀點,我不能真正評論)。我以前告訴過你的「刷新」方法([在你上一個問題中])(http://stackoverflow.com/questions/10648696/iphone-refreshing-tabcontroller-and-content))應該可以工作,只要你實現刷新方法正確。你不應該直接在視圖控制器上調用'viewDidLoad'或'loadView',特別是那些已經加載的(crash city)。 –