Подкласс UIViewController, viewDidLoad вызывается неоднократно - PullRequest
2 голосов
/ 15 января 2012

Я подклассифицировал 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

viewDidLoad () из WelcomeViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    // hide the buttons
    [[self signUp] setHidden: YES];
    [[self logIn] setHidden: YES];
}

1 Ответ

8 голосов
/ 15 января 2012

Вы переопределяете loadView, но ваша реализация пуста, и вы не назначаете представление.Удалите переопределение loadView.

Из Ссылка на класс UIViewController (выделено мной):

Никогда не вызывайте этот метод напрямую.Контроллер представления вызывает этот метод, когда запрашивается свойство view, но в данный момент оно равно nil.Если вы создаете свои представления вручную, вы должны переопределить этот метод и использовать его для создания ваших представлений.Если вы используете Interface Builder для создания ваших представлений и инициализации контроллера представления, то есть вы инициализируете представление с помощью initWithNibName: bundle: метод, устанавливаете свойства nibName и nibBundle напрямую или создаете оба представления и контроллер представления в Interface Builder.тогда вы не должны переопределять этот метод.

Реализация этого метода по умолчанию ищет действительную информацию о nib и использует эту информацию для загрузки связанного файла nib.Если информация о nib не указана, реализация по умолчанию создает простой объект UIView и делает его основным видом .

Если вы переопределите этот метод для создания ваших представлений вручную, Вы должны сделать это и назначить корневой вид вашей иерархии свойству вида .(Представления, которые вы создаете, должны быть уникальными экземплярами и не должны использоваться совместно с любым другим объектом контроллера представления.) Ваша пользовательская реализация этого метода не должна вызывать super.

...