2012-06-14 67 views
0

我重寫一個UIViewController內的loadView方法如下:獲取的UIViewController重新加載不同的UIView編程

-(void)loadView 
{ 
    NSLog(@"HPSFormController loadView starting"); 

    HPSFormView* viewForThisController = [ [ HPSFormView alloc ] initWithFrame:_frame ] ; 
    self.view = viewForThisController; 

} 

當某個按鈕被視圖內按下則相同的UIViewController再次獲得控制,並在該點我希望完全改變控制器顯示的視圖。如下:

-(void)buttonTapped 
{ 
    ABCFormView* newview = [ [ ABCFormView alloc ] initWithFrame:_frame ] ; 
    self.view = newview; 
} 

然而,buttonTapped方法不加載所述第二視圖。而是顯示一個完全空白的視圖。

如何獲取按下按鈕時視圖控制器重新加載一個完全不同的看法?

+0

您應該使用導航控制器,並使用正確的選項集推送您創建的相同uiviewController子類的新實例。 –

+0

這不是一個好選擇,因爲視圖控制器包含很多我需要複製的模型信息,加上我切換視圖很多,所以我會一直彈出並推動控制器。有沒有辦法簡單地改變現有控制器管理的UIView? – whatdoesitallmean

+0

_frame在loadView和buttonTapped之間保持一致嗎? 'self.view'通常由UIKit編輯以考慮各種因素。我建議實際上不要更改'self.view',而只是添加和刪除視圖作爲'self.view'的子視圖。 –

回答

0

但是,buttonTapped方法不加載第二個視圖。而是顯示一個完全空白的視圖。

問題出在你創建ABCFormView的方式不可能嗎?我的意思是,似乎原來的觀點是空的觀點所取代,所以請後者如何創建......你的意見

編輯AFTER:

如果你說的觀點是「內的創建視圖控制器」中viewDidLoad方法,那麼你應該實例化視圖控制器:

@property (...) ABCFormViewController* newviewController; 

.... 

-(void)buttonTapped 
{ 
    self.newviewController = [ [ ABCFormViewController alloc ] init] ; 
    self.view = newviewController.view; 
} 

記住,newviewController必須爲你使用它的控制view只要左右,否則你會得到一個崩潰。這就是爲什麼我將其參考存儲在一個屬性中的原因。

+0

視圖在視圖控制器內的viewDidLoad方法中正確創建,但是當buttonTapped方法正確設置self.view(但在loadView內設置self.view時調用它)時,永遠不會調用該視圖。 – whatdoesitallmean

+0

請參閱我的編輯... – sergio

+0

您是否嘗試將您的'ABCFormView'添加爲子視圖,而不是直接分配給self.view? – sergio

0

顯然,你不能簡單地設置self.view = NewView的讓你看到新的觀點;因爲newView從未作爲子視圖添加到任何其他視圖 - 即不在窗口中。

如果您需要切換到不同的視圖,您應該將APSFormView作爲子視圖添加到您的viewcontroller.view,並且當您需要切換時,從superview中刪除APSFormView,然後將ABCFormView作爲新的子視圖添加到viewcontroller.view 。

0

如果你的loadView實現不必做太多東西,它可能是更好用故事板初始設置。很容易錯過,但是您可以在故事板中指定該視圖應該是自定義類型(在選中視圖的「身份檢查器」中)。此外,可能值得評估爲什麼對於相同的視圖控制器實例來說完全不同的視圖類別是必需的;對我來說,這可能是關於應用程序設計的一面紅旗。你可能更適合兩個視圖控制器之間的流程,或者在這個自定義的UIView擴展類中編寫一些狀態更改邏輯。我的決定將基於意見所代表的模式,以及每個行爲旨在促進的行爲。

如果模型不同(即您的第一個視圖顯示一個帳戶列表,第二個顯示一個帳戶詳細信息),或者行爲顯着不同(即第一個查看帳戶,第二個創建新帳戶),那麼我會使用兩個不同的視圖控制器。

如果模型和行爲是相似的,風格應該改變,那麼我可能會在自定義視圖類中編寫狀態更改代碼來重新排列事物等。

如果你來自不同的平臺,起初看起來可能很愚蠢,但我們真的會毫不猶豫地在視圖控制器周圍亂放。它們被框架優雅地處理,並被設計爲管理「屏幕內容」並且易於交換爲另一個屏幕。

0

很難說不知道ABCFormViewController裏面有什麼。我在視圖控制器上有一些時間問題,我只需要生成視圖,因爲我想捕獲它的內容來創建一個PDF文件(它的視圖永遠不會顯示在屏幕上)。在這種情況下,我需要插入這樣的代碼:我做

 otherVC.view = newviewcontroller.view; 

之前,否則我得到一個空白頁

[newviewcontroller.view setneedsrefresh]; 

。 我相信我得到這個,因爲到時候所有的東西都被整理出來ARC會分配newviewcontroller,所以視圖是零。在你的情況下,這可能不是問題。是否有一個原因,你需要第二個和第三個視圖控制器放入你的視圖,因爲一個簡單的方法是通過模態,彈出視圖或導航控制器將控制轉移到其他視圖控制器。另一種更常用的方法是在XIB中創建多個視圖,然後將其加載到空白視圖中,而不是爲每個視圖創建視圖控制器。

+0

順便說一句,如果你想去多個視圖,只加載第二和第三作爲子視圖,有命令從超級視圖刪除子視圖...。 [[[self.view subviews] objectAtIndex:0] removeFromSuperview]; – Paulo