![](/img/trans.png)
[英]iPhone: What gets called after viewDidLoad before viewWillAppear?
[英]What method is called before viewDidLoad() but after main?
我觀察到viewDidLoad()
在didFinishLaunchingWithOptions()
之前被調用,我正在尋找可以放置一些必須在viewDidLoad()
之前調用的初始化代碼的地方。
有這樣的地方嗎?
此外,從其他地方調用 viewDidLoad() 也是可以接受的。 應該沒問題,還是風險太大?
你錯了。
直接在方法頭下面放一個NSLog,你會看到后面直接調用了ViewDidLoad。
[self.window addSubview:self.yourViewController.view];
因此,您要么使用 viewDidLoad,要么使用您可以使用的並不是很漂亮。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
這甚至在 ViewDidload 之前被調用
您可以在 viewDidLoad 中進行應用程序初始化,但不要在此處進行任何邊界或大小設置,因為它們尚未設置。
在 viewDidLayoutSubviews 中執行它們,它在 viewDidLoad 之后調用。
我找到了這篇文章,這對我很有幫助:
當我使用 MainWindow.xib 文件添加想要添加到窗口的視圖控制器時,我遇到了類似的問題。
為了解決這個問題,我在應用程序委托的 didFinishLaunchingWithOptions: 方法中分配了窗口的 rootViewController(您也可以調用 addSubView,但分配 rootViewController 更好)。 完成此操作后,您可以輕松地將您想要的任何邏輯放在發生這種情況的前面或后面。 它讓您完全控制視圖控制器何時加載。 相比之下,當視圖控制器通過 nib 加載時,很難執行它前面的代碼(如果可能的話)。 我知道您在應用程序的 plist 中指定了主要的 xib,但我不知道是否有辦法在加載該筆尖之前運行代碼。
通常,由於這個原因,我避免在 xib 中添加視圖控制器。
我的代碼看起來更像:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// special pre load logic here...
UIViewController *myVC = [[MyAwesomeViewController alloc] init];
self.window.rootViewController = myVC;
[myVC release];
// special post load logic here...
[self.window makeKeyAndVisible];
return YES;
}
您可以將初始化代碼放在類的init
方法中。
從其他地方再次調用viewDidLoad
也可以。 這就像任何其他方法一樣。
編輯:
調用viewDidLoad
——但你應該小心內存管理。 如果您在viewDidLoad
分配對象,再次調用它會導致泄漏。 因此,由於viewDidLoad
的典型功能,您可能希望將代碼提取到另一個方法中,您將重復調用該方法並從viewDidLoad
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.