子类化UIViewController,重复调用viewDidLoad

时间:2012-01-15 00:23:52

标签: objective-c ios xcode uiviewcontroller subclass

我将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];
}

1 个答案:

答案 0 :(得分:8)

您正在覆盖loadView,但您的实施是空的,并且您没有分配视图。删除loadView覆盖。

来自UIViewController Class Reference(强调我的):

  

你永远不应该直接调用这个方法。视图控制器调用   请求view属性但当前为nil时此方法。   如果手动创建视图,则必须覆盖此方法   用它来创建你的观点。如果使用Interface Builder进行创建   您的视图并初始化视图控制器 - 即初始化   使用initWithNibName:bundle:方法的视图,设置nibName和   直接使用nibBundle属性,或创建视图和视图   在Interface Builder中的控制器 - 然后你不能覆盖它   方法

     

此方法的默认实现查找有效的nib   信息并使用该信息加载相关的nib文件。   如果未指定nib信息,则将创建默认实现   一个简单的UIView对象,并使其成为主视图

     

如果您覆盖此方法以手动创建视图,   您应该这样做,并将层次结构的根视图分配给   查看属性。 (您创建的视图应该是唯一的实例和   不应与任何其他视图控制器对象共享。)   这种方法的自定义实现不应该调用super。