2010-01-15 36 views
4

我處於一種情況,其中一個ViewController有很多特殊情況,我需要一種處理它們的優雅方式。總體思路是我的View的下半部分在每種情況下都是相同的。 上半部分針對每種情況進行了更改。需要幫助瞭解如何以編程方式添加IB創建的UIViews

按照DRY,我想避免爲每個特殊情況製作ViewController的副本,並在每個ViewController的底部更改按鈕(如果需要進行更改)。通常,我創建一個.xib,在IB中構建我的UI,並建立連接。我爲屏幕的下半部分做了這個,它工作正常。

對於屏幕的上半部分,我分別創建了單獨的UIView實例。我希望在ViewController出現之前動態加載那些(文檔告訴我使用layoutSubviews,layoutIfNeeded和setNeedsLayout)。

這個設計呈現的問題是我習慣於在IB中與我定義爲IBOutlets的變量進行連接。我遵循頭文件中的變量屬性模式,使它們成爲屬性並使用.m文件中的「合成」。我也習慣於將UITextField的委託設置爲文件所有者,這樣我就可以在鍵盤上辭去他們的第一個響應者狀態。

如果Interface Builder只允許我在給定的視圖中訪問文件所有者和IBOutlets,那麼如何在超級視圖中訪問這些動態添加它的屬性?這裏的設計是什麼?

在此先感謝!

回答

3

它看起來像添加頂視圖是您的視圖控制器的業務。我會在發送[super loadView]之後在控制器的-loadView中執行此操作。有兩種方法可以在運行時將它們連接在一起。

  1. 做整個程序,包括分配子視圖,設置代表等
  2. 創建在同一筆尖所有的俯視圖,將它們連接根據需要添加一個出口爲每頂視圖到您的視圖控制器。不要在IB的主視圖中放置任何頂級視圖。這樣,當控制器加載筆尖時,它將加載所有頂部視圖並正確工作,只需將正確的視圖安裝到其主視圖的子視圖中即可。

你喜歡哪種方法取決於你必須處理多少頂視圖,在代碼和IB中設置它們有多困難,以及你的應用需要多長時間才能將很多視圖加載到一個大的筆尖上。

1

您可以在不同的視圖控制器中重複使用來自XIB的相同視圖。您的XIB應該包含一個根對象(視圖,而不是控制器),可以從代碼中加載和訪問:

myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] objectAtIndex:0];