2008-11-11 52 views
6

我想繞過UIViews和UIViewControllers的角色。如果我以編程方式創建和插入子視圖,通常是從視圖還是控制器執行此操作?UIViewController與UIView - 哪一個應該創建子視圖?

我真的只是想知道這是否有一個約定/模式。在我的示例應用程序中,我在運行時加載了50個圖像,將它們添加爲主視圖的子視圖,然後讓用戶將它們拖動到屏幕上。我目前做的視圖的所有的initWithCoder初始化:

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if (self = [super initWithCoder:coder]) { 
     // load UIImageViews and add them to the subview 
    } 

    return self; 
} 

的觀點也實現的touchesBegan/touchesMoved允許拖動。當我嘗試訪問initWithCoder中的[self frame] .size時,我的問題就出現了,它似乎還沒有被初始化。這讓我覺得我可能會在錯誤的地方被加載圖片...

+0

這取決於你與他們做什麼...通常使用一個視圖控制器,當你想帶自轉等全屏視圖,或者當你要插入一個全屏視圖有點像標籤控制器。你能稍微擴展你的問題嗎? – 2008-11-11 04:51:04

回答

7

這取決於你在做什麼。如果視圖表示「打包」的東西,那麼您從視圖本身創建子視圖。如果你只是將視圖聚合在一起,那麼你應該從視圖控制器來完成。

想想傳統封裝。您的子視圖在概念上是其超級視圖的「部分」,還是僅僅存在於繪圖層次結構中?

+0

我用更多的信息更新了這個問題。就我而言,視圖只是層次結構的一部分,但它也實現了touchesBegan/touchesMoved以允許拖動。 – 2008-11-11 05:05:19

2

假設你正在創建一個包含一些控件,比如編輯多個字段或東西記錄的視圖。由於您將在視圖控制器中使用這些文本字段及其數據,因此它們在概念上屬於視圖控制器,並且父視圖僅用於分組和佈局目的。這可能是更常見的情況。

如果你正在創建一個視圖子類表現得像一個新的控制,例如,那麼我會說你應該創建和視圖類中完全管理的意見。我想這種情況在實踐中會少發生。

2

這聽起來像你可能將它們添加到錯誤的地方。如果您將子視圖添加到ViewController中,那麼您可以在viewDidLoad上完成這項工作,並確保主視圖已經初始化並準備好訪問。

1

假人的解釋是這樣的:

每當你打算顯示的視圖,模式(presentModalViewController)

子類的UIViewController或內部的UINavigationController(pushViewController)

子類的UIView每當它是主視圖中的小部件...比如你希望做的自定義按鈕或...

更具體地在你的榜樣......如果要初始化UIViewControllers可以設置視圖的屬性如。只有在您的視圖添加到超級視圖後才能使用框架大小。此時只有 UIViewController加載並初始化其視圖。

我覺得你的情況,你應該使用UIViews ...你可以分配&初始化後立即設置幀大小。

相關問題