2012-05-24 83 views
0

我有一個應用程序底部的一些標籤(UITabViewController),並且大多數標籤還包括頂部的工具欄。從iOS的筆尖動態加載子視圖

用戶需要登錄才能訪問的標籤之一 - 我們稱之爲「我的帳戶」選項卡。一旦他們登錄後,他們會顯示他們的個人資料信息,或者如果他們還沒有設置它,那麼他們會被顯示一個對話,解釋填寫他們的個人資料的好處以及一個大按鈕,說: 「開始使用」。這三個屏幕的底部都有標籤,頂部有一個工具欄。所以我製作的視圖只佔用屏幕的中間部分 - 因此它們需要作爲子視圖加載。實質上,我試圖根據用戶的當前狀態顯示三個不同子視圖中的一個,並且我需要能夠在用戶狀態發生變化(例如登錄時)時相互切換這些子視圖。

我最初創建這些子視圖三個獨立的「層」,只是用來setHidden在它們之間進行切換,但是無論有初始化所有3次的大的缺點正在被使用,其中的。我也不確定如何在隱藏/取消隱藏時如何動畫過渡。

理想情況下,我想創建三個獨立的nib文件(每個視圖一個)共享相同的viewcontroller(父控制器),並根據用戶的狀態動態加載它們。因此,如果用戶沒有登錄,我將加載「登錄」筆尖,然後使用addSubView將其添加到屏幕。當用戶登錄時,我可以加載一個其他筆尖作爲子視圖,然後使用動畫來切換子視圖。

我遇到的問題是,所有三個子視圖都很簡單,我只想保留在頂層視圖控制器(「MyAccountViewController」)內處理按鈕點擊的邏輯。例如,我希望能夠處理負責顯示用戶個人資料信息的相同視圖控制器中的「登錄」按鈕的點擊事件。我不想爲每個子視圖創建一個單獨的視圖控制器。

這是目前我在做什麼:

- (void)showLoginView { 
    UIView *loginView = [[[NSBundle mainBundle] loadNibNamed:@"Login" owner:self options:nil] objectAtIndex:0]; 
    [self.view addSubview:loginView]; 
} 

它只是崩潰與EXC_BAD_ADDRESS的 「addSubview」 行。順便說一下,它的行爲似乎是內存不足,可能是由於無限循環或其他原因。我有一種感覺,我很喜歡這裏的解決方案。

是我想要做的可能嗎?

我也有興趣瞭解處理登錄屏幕的任何最佳實踐。我一直在爲iPhone應用程序找出最佳工作流程時遇到許多麻煩。我習慣於編寫網絡應用程序(是的,登錄是必要的 - 這個應用程序綁定到一個網站)。

謝謝!

編輯:我已經考慮寫爲每個子視圖碎粒的單獨視圖控制器。這些視圖控制器會處理各自的nib中的按鈕點擊,然後使用Objective-C的委託功能將事件傳播到父視圖控制器,但如果可能的話,這是很多額外的代碼。

+0

然後在.h文件中添加另一個IBOulet UIView * loginView,並通過從UICatlog中拖動添加UIView並用loginView綁定它。現在只要你想添加[self.view addSubview:loginView]就可以做到這一點; –

回答

0

如果你還沒有,我會仔細檢查你的連接在筆尖和NSLog的類變種的索引0絕對確保它是一個UIView。

我的建議:報廢筆尖。如果你不能用代碼來做,爲什麼還要麻煩?我只使用nibs作爲佈局工具,並且絕不將它們打包爲二進制文件。只需製作UIView子類,並節省自己的時間,內存,代碼和存儲空間。

至於你的登錄屏幕想法的麻煩,當我卡住了,我訪問Mobile Design Patterns Gallery的靈感。如果您想要更多...... -Expert我們應該說 - 意見,請訪問SO的視覺表親ux.stackexchange.com

+0

我決定繼續走另一條路線。我正在爲登錄視圖創建一個viewcontroller + nib,所以我可以在應用程序的其他部分重用它。在這種情況下,我將登錄視圖添加爲子視圖,但在其他頁面上,我打算[呈現登錄視圖](http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ ModalViewControllers.html)。由於缺乏其他答案而給予您答案的答案... –