Подклассный UIViewController не показан - PullRequest
1 голос
/ 20 февраля 2012

Я переклассифицировал класс UIViewController, как показано в следующем коде.Контроллер представления, закодированный ниже, создается Storyboard в TabBarController, но его представления (метки, панели инструментов, которые я добавил с помощью Interface Builder) не отображаются.Единственный показанный элемент - это панель вкладок TabBarControllers.

.h:

@interface FinstatViewController : UIViewController <SplitViewBarButtonItemPresenter,UISplitViewControllerDelegate>
@property (nonatomic, strong) UIBarButtonItem *splitViewBarButtonItem;
@property (weak, nonatomic) IBOutlet UINavigationBar *toolbar;
@end

.m:

#import "FinstatViewController.h"

@interface FinstatViewController ()

@end

@implementation FinstatViewController
@synthesize splitViewBarButtonItem = _splitViewBarButtonItem;   // implementation of SplitViewBarButtonItemPresenter protocol

@synthesize toolbar = _toolbar;                                 // to put splitViewBarButtonItem in

- (void)setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem
{
    if (splitViewBarButtonItem != _splitViewBarButtonItem) {
        NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy];
        if (_splitViewBarButtonItem) [toolbarItems removeObject:_splitViewBarButtonItem];
        if (splitViewBarButtonItem) [toolbarItems insertObject:splitViewBarButtonItem atIndex:0];
        self.toolbar.items = toolbarItems;
        _splitViewBarButtonItem = splitViewBarButtonItem;
    }
}

- (void)awakeFromNib  // always try to be the split view's delegate
{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)loadView
{
    // If you create your views manually, you MUST override this method and use it to create your views.
    // If you use Interface Builder to create your views, then you must NOT override this method.
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //self.splitViewController.delegate=self;
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setToolbar:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES; // (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

Что я сделал не так?

Спасибо!

1 Ответ

1 голос
/ 21 февраля 2012

Прочтите комментарий к этому методу, а затем полностью удалите метод:

- (void)loadView
{
    // If you create your views manually, you MUST override this method and use it to create your views.
    // If you use Interface Builder to create your views, then you must NOT override this method.
}

У вас просто нет представления (то есть self.view), потому что вы его не создаете, поэтому ваш viewController отображается пустым. Вы должны использовать - loadView, когда хотите создать свое представление в коде. Но вы используете раскадровки для создания своего представления, поэтому НЕ ДОЛЖНЫ использовать - loadView

Это не твоя вина, виновата Apple. Шаблон Xcode 4.3 UIViewController запущен.
Какой-то умный парень из Apple подумал, что вы хотите создать свое представление в коде, когда снимите флажок «С XIB для пользовательского интерфейса». Он, вероятно, пропустил объявление раскадровки вообще.

После того, как вы удалите эту часть, подумайте о регистрации ошибки в http://bugreport.apple.com/

EDIT: эта ошибка исправлена ​​в Xcode 4.3.2. Шаблон больше не содержит - (void)loadView

...