2013-04-01 208 views
0

我在編寫應用程序時未使用storyboard/xib創建視圖,也不確定是放置視圖設置代碼的最佳位置。我嘗試了幾種不同的方法,但我不確定將視圖設置代碼與控制器代碼分開的最佳方式。如何以編程方式創建iOS應用程序視圖

到目前爲止我曾嘗試的方法是:

  1. 把所有我的視圖設置代碼(創建和定位按鈕/標籤)等一個控制器viewDidLoad方法內。我很確定這是一種糟糕的做事方式,因爲你最終會在控制器中產生大量代碼。

  2. 子類別UIView並在initWithFrame方法內設置界面元素。然後我在視圖控制器視圖的頂部添加這個視圖。

    _customView = [[CustomView alloc] initWithFrame:self.view.frame]; 
    _customView.customLabel.text = @"Foo"; 
    [self.view addSubView:_customView] 
    

或I分配控制器查看是我customView

_customView = [[CustomView alloc] initWithFrame:self.view.frame]; 
self.view = _customView; 
_customView.customLabel.text = @"Foo"; 

雖然試圖保持這個問題儘可能非主觀,是否有編程方式創建iOS接口的最佳做法?這兩種方法都是保持視圖代碼和控制器代碼獨立且可重用的好方法嗎?

+0

你需要重用該代碼嗎?如果是的話,子類化或創建一個UIView的類別擴展將是好的。在這種情況下,我更喜歡一個子類。 –

+0

是的目的是讓代碼儘可能重複使用和清潔。我認爲子類化運作良好,我只是不確定使用子類化視圖的最佳方式。也許任何一種方式都很好。 – AFraser

回答

1

如果您只需要一次使用該視圖,請將代碼保留在viewDidLoad方法中。也許你可以移動必要的代碼來在你的控制器內的特定方法中創建視圖。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // other code here... 
    [self createView]; 
} 

此外,你也可以認爲重寫loadView方法,並把代碼那裏,如果你的觀點將是你的控制器的view。從Apple文檔。

您可以重寫此方法以便手動創建視圖。 如果您選擇這樣做,請將視圖層次結構的根視圖分配給視圖屬性 。

如果您需要多次實例化您的視圖,我將繼承UIView並使用委託模式與您的控制器通信。

如果您選擇此方法,您需要覆蓋layoutSubviews方法來安排您的視圖中的兒童。

一個明確的例子可以在How To Make a Custom UIView in iOS 5: A 5 Star Rating View中找到。

+0

好吧,我可以看到這是最簡單的方法,但它不會導致你有'胖'的控制器,並違反iOS應用程序使用的MVC設計模式? – AFraser

+0

@AFraser不,你的子類是一個'UIView'而不是'UIViewController'。他們是不同的東西。 –

+0

@AFraser恕我直言,這種做法很乾淨。你可以繼承一個視圖。你與一個帶有delagate的控制器交流。你的意見是什麼意思? –