我将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];
}
答案 0 :(得分:8)
您正在覆盖loadView
,但您的实施是空的,并且您没有分配视图。删除loadView
覆盖。
来自UIViewController Class Reference(强调我的):
你永远不应该直接调用这个方法。视图控制器调用 请求view属性但当前为nil时此方法。 如果手动创建视图,则必须覆盖此方法 用它来创建你的观点。如果使用Interface Builder进行创建 您的视图并初始化视图控制器 - 即初始化 使用initWithNibName:bundle:方法的视图,设置nibName和 直接使用nibBundle属性,或创建视图和视图 在Interface Builder中的控制器 - 然后你不能覆盖它 方法
此方法的默认实现查找有效的nib 信息并使用该信息加载相关的nib文件。 如果未指定nib信息,则将创建默认实现 一个简单的UIView对象,并使其成为主视图。
如果您覆盖此方法以手动创建视图, 您应该这样做,并将层次结构的根视图分配给 查看属性。 (您创建的视图应该是唯一的实例和 不应与任何其他视图控制器对象共享。) 这种方法的自定义实现不应该调用super。