web-dev-qa-db-fra.com

Plume chargée mais la sortie de la vue n'était pas définie - Swift edition

J'ai un projet qui est tout en objectif C, à l'exception de mon contrôleur de vue, qui est en Swift.

Quand je l'exécute, j'obtiens l'erreur

Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: '- [UIViewController _loadViewFromNibNamed: bundle:] a chargé la plume "..." mais la sortie de la vue n'a pas été définie.'

J'ai donc ouvert mon fichier nib, regardez "Propriétaire du fichier", et je vois que la vue ne s'affiche même pas du tout comme une sortie.
Pour mon ancien contrôleur de vue (objectif C), la sortie de vue apparaît.

Dans mon Swift contrôleur de vue, j'ai essayé de remplacer la variable "view" d'UIViewController afin de la forcer à être un @IBOutlet, mais il s'est plaint que la variable "view" soit de type UIView, s'est plaint d'UIView?, et s'est plaint d'UIView !.

Voici des versions simplifiées de

mon 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
    }
}

Que dois-je faire pour que ma vue s'affiche?

Merci.

(Oui, c'est une question similaire à Nib chargé mais la sortie de vue n'a pas été définie - nouveau dans InterfaceBuilder mais la sortie de vue ne s'affiche pas.)

19
cowlinator
  • Premièrement - définissez une classe personnalisée dans votre fichier nib (propriétaire du fichier -> troisième icône -> classe personnalisée: YourViewController)
  • Deuxièmement - la dernière icône du propriétaire du fichier -> liez (faites glisser) la propriété "view" à la vue de l'interface

Initiez votre ViewController comme ceci:

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

Ça va marcher. Ne faites aucune manipulation avec View.

39
user3677173

Si vous avez tout essayé et que vous obtenez toujours cette erreur, essayez de recréer le fichier de classe à partir de zéro, mais n'oubliez pas de cocher la case "Créer également un fichier XIB". Cela reliera automatiquement quelques éléments qui ne sont pas liés lors de la création de ces fichiers séparément. Après avoir créé cela, vous pouvez probablement tout couper et coller sur le nouveau XIB et cela devrait fonctionner correctement.

Je trouve ce problème spécifiquement avec la création de fichiers séparément dans Swift.

11
Travis M.

J'ai eu le même problème, ma 2e vue sur mon contrôleur de vue n'a pas pu se charger. J'ai changé le nom de la vue dans la propriété (comme j'avais précédemment donné "View"). Votre contrôleur de vue existant avait déjà des références à la vue au-dessus avec le même nom (Vue). D'où l'erreur. Essayez de changer les noms des prises. Cela a fonctionné parfaitement dans mon cas.

1
user5553647

J'ai trouvé sur le forum chinois que cela pouvait arriver lorsque vous avez des noms similaires pour ViewController et une vue depuis XIB.

Exemple SpecialOfferViewController et SpecialOfferView

J'ai renommé

SpecialOfferViewController et OfferView et l'erreur a disparu !!!

0
Leonif

J'avais un fichier xib nommé FooView et une classe de contrôleur de vue nommée FooViewController.

FooVew n'était pas destiné à être la vue racine de FooViewController, seulement une sous-vue. Pourtant, le comportement par défaut de UIViewController est de essayer automatiquement exactement cela . Et donc, mon application plantait avec cette erreur au premier point d'accès à view de mon contrôleur.

Ce comportement peut être évité en utilisant l'un des éléments suivants:

  1. Renommez votre classe de contrôleur ou le fichier xib pour les dissocier
  2. override var nibName: String? { nil }
  3. override func loadView() et affectez-vous à view

J'y suis allé avec 2 car il semblait le moins susceptible de se faufiler pour me mordre plus tard.

0
Nathan Hosselton