子类化UIViewController,重复调用viewDidLoad

bmi*_*ker 2 xcode subclass objective-c uiviewcontroller ios

我子类UIViewControllerSTViewController,发现的类继承STViewController有他们viewDidLoad反复调用的方法.最终崩溃的应用程序.STViewController在这一点上基本上是一个空白的实现.我是子类,如下所示:

#import "STViewController.h"

@interface WelcomeViewController : STViewController {
Run Code Online (Sandbox Code Playgroud)

STViewController.h

#import <UIKit/UIKit.h>

@interface STViewController : UIViewController
{
}
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

来自WelcomeViewController.m的viewDidLoad()

- (void)viewDidLoad
{
    [super viewDidLoad];

    // hide the buttons
    [[self signUp] setHidden: YES];
    [[self logIn] setHidden: YES];
}
Run Code Online (Sandbox Code Playgroud)

mag*_*gma 8

您是重写loadView,但您的实现是空的,并且您没有分配视图.删除loadView覆盖.

UIViewController类参考(强调我的):

你永远不应该直接调用这个方法.视图控制器在请求视图属性时调用此方法,但当前为nil.如果手动创建视图,则必须覆盖此方法并使用它来创建视图.如果使用Interface Builder创建视图并初始化视图控制器 - 也就是说,使用initWithNibName:bundle:方法初始化视图,直接设置nibName和nibBundle属性,或者在Interface Builder中创建视图和视图控制器 - 那么你不能覆盖这个方法.

此方法的默认实现查找有效的nib信息,并使用该信息加载关联的nib文件.如果未指定nib信息,则默认实现会创建纯UIView对象并使其成为主视图.

如果为了手动创建视图而重写此方法,则 应该这样做并将层次结构的根视图分配给view属性.(您创建的视图应该是唯一的实例,不应与任何其他视图控制器对象共享.)此方法的自定义实现不应调用super.