【问题标题】:Subclassing UIViewController, viewDidLoad called repeatedly子类化 UIViewController,viewDidLoad 反复调用
【发布时间】:2012-01-15 00:23:52
【问题描述】:

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

【问题讨论】:

  • 我们能看到'空白实现吗? (STViewController)
  • viewDidLoad 实现在 WelcomeViewControllerSTViewController 中的表现如何?
  • 用这些细节更新了帖子。

标签: objective-c ios xcode uiviewcontroller subclass


【解决方案1】:

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

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

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

此方法的默认实现会寻找有效的 nib 信息并使用该信息加载相关的 nib 文件。 如果没有指定 nib 信息,默认实现会创建 一个普通的 UIView 对象并使其成为主视图

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

【讨论】:

  • 太棒了!这解决了我的问题!谢谢!
  • 真的太棒了!控制台中没有记录任何提示。!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多