[英]Subclassing UIViewController, viewDidLoad called repeatedly
我將UIViewController
子類化為STViewController
並注意到從STViewController
繼承的類會重復調用它們的viewDidLoad
方法。 最終崩潰的應用程序。 STViewController
基本上是一個空白實現。 我是子類,如下所示:
#import "STViewController.h"
@interface WelcomeViewController : STViewController {
STViewController.h
#import <UIKit/UIKit.h>
@interface STViewController : UIViewController
{
}
@end
STViewController.m
#import "STViewController.h"
@implementation STViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)loadView
{
// Implement loadView to create a view hierarchy programmatically, without using a nib.
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
來自WelcomeViewController.m的viewDidLoad()
- (void)viewDidLoad
{
[super viewDidLoad];
// hide the buttons
[[self signUp] setHidden: YES];
[[self logIn] setHidden: YES];
}
您正在覆蓋loadView
,但您的實現是空的,並且您沒有分配視圖。 刪除loadView
覆蓋。
從UIViewController類參考 (強調我的):
你永遠不應該直接調用這個方法。 視圖控制器在請求視圖屬性時調用此方法,但當前為nil。 如果手動創建視圖,則必須覆蓋此方法並使用它來創建視圖。 如果使用Interface Builder創建視圖並初始化視圖控制器 - 也就是說,使用initWithNibName:bundle:方法初始化視圖,直接設置nibName和nibBundle屬性,或者在Interface Builder中創建視圖和視圖控制器 - 那么你不能覆蓋這個方法。
此方法的默認實現查找有效的nib信息,並使用該信息加載關聯的nib文件。 如果未指定nib信息, 則默認實現會創建純UIView對象並使其成為主視圖 。
如果為了手動創建視圖而重寫此方法,則應該這樣做並將層次結構的根視圖分配給view屬性 。 (您創建的視圖應該是唯一的實例,不應與任何其他視圖控制器對象共享。)此方法的自定義實現不應調用super。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.