簡體   English   中英

從情節提要中添加了自定義初始化子視圖

[英]Custom initialise subview added from storyboard

我有一個要從情節UIViewController中添加的UIViewController的子類。

所以我使用的似乎是標准方法:

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];
[self addChildViewController:svc];
[self.view addSubview:svc.view];

哪個很好,但是如果我想在子視圖上調用自定義init方法呢?

我可以做類似的事情:

svc = [svc initWithFoo:@"Hello"];

似乎必須在addSubview調用之后才能運行。

這是最好的方法嗎?

似乎有點非常規。 在已經創建的對象上調用init方法似乎不再是真正的init方法。

也許我應該將其命名為setWithFoo:或其他什么東西不讓它返回任何東西?

如果要在從情節提要實例化視圖控制器后對其進行其他設置,可以在視圖控制器的類中創建一些方法,並在情節提要的instantiate方法之后調用它們。

但是請注意,如果您嘗試在這些方法中的任何UI組件上進行更改,則將不會應用它們,並且應用程序可能會崩潰。 因此,請使用這些方法為視圖控制器設置參數,例如對象數組或任何類型的數據,然后在視圖控制器的viewDidLoad/viewWillAppear/viewDidAppear方法中為視圖控制器的視圖應用UI更改。

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];

會導致SubViewController的- (id)initWithCoder:(NSCoder *)decoder {}方法被- (id)initWithCoder:(NSCoder *)decoder {}

重寫該方法(別忘了調用super

本質上,我認為答案是您不能在從情節提要添加的ViewController上使用自定義初始化程序。 相反,您必須如上所述在生命周期的適當時間直接或通過方法設置屬性。

同樣如前所述,VC將通過initWithCoder實例化,因此調用額外的初始化程序可能是多余的(?)。

我在嘗試使用自定義初始化程序時遇到了問題,如果我在添加子視圖之前調用了它,則該初始化程序包含對super的調用。 我想只是添加一個空白視圖,我想是因為超類當時似乎不了解情節提要。 我在取消對super的調用方面取得了更大的成功,但這似乎是錯誤的。

將子視圖添加到滾動視圖時,這種情況將更有意義。 為簡單起見,我將其排除在示例之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM