2011-09-26 42 views
0

我正在開發一個應用程序,需要用戶先登錄才能使用服務的其餘部分。我是否正確地呈現我的viewControllers?

這個應用程序是由標籤欄控制器與4個標籤欄項目。所有這4個標籤欄項目都有導航控制器。

現在,我以模態方式呈現loginViewController。我在登錄過程中實現了「記住我」功能,這將在用戶下次重新啓動應用程序時自動登錄。我通過使用NSUserDefaults保存指標並在viewDidLoad期間執行此操作,檢查用戶是否選擇了「記住我」,並在需要時以模態方式呈現loginViewController。

當用戶註銷時,我會再次以模態方式呈現loginViewController並刪除NSUserDefaults。但是,這將使tabBarController的viewController的其餘部分保持與用戶註銷之前相同的狀態,這意味着當用戶再次登錄時它不會是全新的副本。如何在用戶登錄時確保它是全新的副本?意思是textFields和all,不應該顯示在之前的登錄過程中所做的修改。

所有的一切,我要加載的viewController tabBarController的全新副本,只要在

回答

0

有幾種方法可以做到這一點。一種是在登出時發送NSNotification,並且具有需要重新加載其信息的所有視圖,觀察該通知並進行更新。

另一種方法是更新每個視圖的數據viewDidAppear。這種方法的主要缺點是它會每次更新,無論它們是否註銷。

通知的方式是這樣的:

在註銷視圖控制器:

if (userDidLogout) 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName: USER_LOGOUT_NOTIFICATION]; 
} 

在需要了解視圖控制器:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(updateMyData:) name: USER_LOGOUT_NOTIFICATION object: nil] 

//... 

- (void) updateMyData: (NSNotification*) note 
{ 
    // ... 
} 
+0

這很好,只是當用戶登錄時我正好看到事件。在用戶註銷時顯示更改會很奇怪。 –

0

。在用戶登錄按下按鈕logout,請確保你釋放了所有的活動視圖。重新登錄時,請創建一個新的視圖集。

您可以使用NSUserDefaults來檢查loginlogout,整個過程必須在邏輯上同步。您需要擔心的唯一事情就是正確釋放所有視圖,並在重新登錄時正確刪除它們。確保沒有內存泄漏,並且您的視圖控制器遵循Apple的 Memory Management指導原則。

0

這是我會怎麼做:

viewWillAppear中被調用每次你打開的選項卡。您可以在viewWillAppear中重新加載視圖內容。

此解決方案每次用戶打開視圖時都會重新載入視圖。有更好的方法來保存最後的用戶狀態,所以每當用戶進入視圖時,檢查UserState(即LoggedIn/LoggedOut)是否匹配,如果不重新加載視圖,則不需要重新加載。

1

iPhone是一個 「個人」設備。這不是一個網絡瀏覽器。瀏覽器是不同的。在iPhone上,如果可能的話避免顯式註銷,或者使找到註銷按鈕非常困難。 Facebook,Twitter,Foursquare都做到這一點。您的手機始終與您同在,並且注重隱私的用戶將設置解鎖密碼。即使其他智能手機也可以遠程擦除(不像瀏覽器)。

在爲移動設備開發時,請考慮移動設備。並非您的網絡應用中的所有功能都需要在移動設備上實施。

話雖如此,如果您仍然需要一個註銷機制,nsnotifications是要走的路。

+0

感謝您的建議,但我不明白爲什麼要「隱藏」註銷按鈕。如果用戶選擇註銷,讓用戶註銷並沒有什麼壞處,不是嗎? –

+0

沒有傷害,但沒有必要。除非您將手機借給某個可能會使用您的應用的人 – Mugunth

+0

雖然我同意iPhone應該是個人設備,但他們經常落入其他人的手中,有時甚至是惡作劇的手。當然,你已經看過明顯不是由主人寫的facebook帖子(即「我愛我的女朋友太多了!她是世界上最好的女人」等等,等等等等:)讓用戶註銷是一個合理的選項,就像用戶選擇不註銷一樣,這是一個可供選擇的選項。 – Olie