Загруженный наконечник, но розетка для просмотра не установлена ​​- Swift edition

У меня есть проект, который находится в Objective C, за исключением моего контроллера представления, который находится в Swift.

Когда я запустил его, я получаю сообщение об ошибке

Завершение приложения из-за неперехваченного исключения 'NSInternalInconsistencyException', причина: '- [UIViewController _loadViewFromNibNamed: bundle:] загрузил значок "...", но выходная точка просмотра не была установлена. '

Итак, я открыл свой файл nib, посмотрю на "File Owner", и я вижу, что представление вообще не отображается как выход.
Для моего старого контроллера просмотра (цель c) открывается окно просмотра.

В моем диспетчере просмотра Swift я попытался переопределить переменную "view" из UIViewController, чтобы заставить ее быть @IBOutlet, но она жаловалась на переменную вида "тип представления" типа UIView, жаловалась на UIView?, и жаловался на UIView!.

Вот упрощенные версии

my AppDelegate.h

#import <UIKit/UIKit.h>

@class MyViewController;
@class MyViewControllerSwift;

@interface MSAppDelegate : UIResponder <UIApplicationDelegate>
{
}

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) UIViewController *viewController;

@end

AppDelegate.m

#import "MyAppDelegate.h"

#import "MyViewController.h"
#import "MySwift-Swift.h"
#import <UIKit/UIKit.h>

@implementation MyAppDelegate

static BOOL USE_SWIFT_VIEW_CONTROLLER = YES;

- (void)dealloc
{
    [_window release];
    [_viewController release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.

    id viewControllerPtr = nil;
    if(USE_SWIFT_VIEW_CONTROLLER)
    {
        viewControllerPtr = [MyViewControllerSwift alloc];
    }
    else
    {
        viewControllerPtr = [MyViewController alloc];
    }

    UIViewController* vController = nil;
    if(USE_SWIFT_VIEW_CONTROLLER)
    {
        vController = [[viewControllerPtr initWithNibName:@"MyViewControllerSwift" bundle:nil] autorelease];
    }
    else
    {
        vController = [[viewControllerPtr initWithNibName:@"MyViewController" bundle:nil] autorelease];
    }

    self.viewController = vController;
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    return YES;
}

ViewController.swift

import Foundation
import AVFoundation

@objc class MyViewControllerSwift : UIKit.UIViewController {

    var player : AVFoundation.AVAudioPlayer?;

    @IBOutlet weak var myTextView : UITextView!;

    required init(coder aDecoder : NSCoder) {
        super.init(coder:aDecoder);
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName:nibNameOrNil, bundle:nibBundleOrNil);
    }

    override func viewDidLoad() {
        super.viewDidLoad();

        println("Using MyViewControllerSwift");
    }

    deinit {
        //TODO
    }
}

Что мне нужно сделать, чтобы отобразить мой просмотр?

Спасибо.

(Да, это аналогичный вопрос для Загруженного nib, но выходная точка просмотра не была установлена ​​- новая для InterfaceBuilder, но выходная точка просмотра не отображается.)

Ответы

Ответ 1

  • Сначала - задайте пользовательский класс в файле nib (File Owner → третий значок → пользовательский класс: YourViewController)
  • Второе - последний значок в владельце файла → ссылка (перетащить) свойство "вид" в представление интерфейса

Настройте свой ViewController следующим образом:

YourViewController(nibName: "YourViewName", bundle: nil)

Это сработает. Не делайте никаких манипуляций с View.

Ответ 2

Если вы все пробовали, и вы все равно получите эту ошибку, попробуйте повторно создать файл класса с нуля, но не забудьте установить флажок "Также создать XIB файл". Это автоматически свяжет несколько элементов, которые не связаны при создании этих файлов по отдельности. После этого вы можете, вероятно, вырезать и вставить все на новый XIB, и он должен работать нормально.

Я нахожу эту проблему специально для создания файлов отдельно в Swift.

Ответ 3

У меня была такая же проблема, мой 2-й вид на моем контроллере просмотра не мог загрузить. Я изменил имя вида в свойстве (как ранее я дал "Вид" ). В вашем существующем контроллере представлений уже есть ссылки на представление поверх него с тем же именем (вид). Отсюда и ошибка. Попробуйте изменить имена розетки. В моем случае он отлично работал.