2014-09-26 24 views
14

Ho un progetto che è tutto in Objective C, tranne che per il mio controller della vista, che è a Swift.pennino caricato, ma la presa di vista non è stato impostato - Swift edizione

quando l'eseguo, ottengo l'errore

terminazione app a causa di eccezione non identificata 'NSInternalInconsistencyException', la ragione: '- [UIViewController _loadViewFromNibNamed: bundle:] caricato il "..." pennino ma il punto di vista non era impostato ".

Così ho aperto il mio file di pennino, guardo "Proprietario del file", e vedo che la vista non si presenta nemmeno come uscita.
Per il mio vecchio controller di visualizzazione (obiettivo c), viene visualizzata la presa di visualizzazione.

Nel mio controller vista Swift, ho provato modificando la variabile "vista" dal UIViewController per forzarlo a essere un @IBOutlet, ma lamentato la "vista" essendo variabile di tipo UIView, lamentato UIView ?, e si è lamentato di UIView !.

Qui ci sono versioni semplificate di

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

Di cosa ho bisogno di fare ottenere la mia vista da mostrare?

Grazie.

(Sì, questa è una domanda simile a Loaded nib but the view outlet was not set - new to InterfaceBuilder ma la presa di vista non si presenta.)

risposta

30
  • In primo luogo - impostare classe personalizzata nel file pennino (proprietario del file -> terza icona -> personalizzato classe: YourViewController)
  • in secondo luogo - l'ultima icona è il proprietario del file -> Link (trascinare) la proprietà "vista" per la visualizzazione dell'interfaccia

Init tua ViewController in questo modo:

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

Funzionerà. Non fare alcuna manipolazione con View.

+0

Ho fatto così. Ho ripristinato tutte le manipolazioni della vista e non ci sono riferimenti nel mio codice. Tuttavia, quando seleziono l'oggetto "File's Owner" e apro l'Inspector di Connections, non esiste alcuna proprietà "view". http://i.pictr.com/4v475ryo0i.png – cowlinator

+0

Inoltre, vorrei sottolineare che ho bisogno di inizializzare il mio ViewController usando l'obiettivo-c, non veloce, quindi in realtà sto inizializzando in questo modo: [[viewControllerPtr initWithNibName: @ Bundle "MyViewControllerSwift": nil] autorelease]; dove viewControllerPtr è un ID assegnato correttamente. – cowlinator

+1

Guarda cosa potresti fare. Crea una vista da zero, non fare nulla con essa. Basta fare clic sul proprietario del file, assegnare il controller e quindi trascinare la visualizzazione. Dovrebbe funzionare al 100%. – user3677173

10

Se avete provato di tutto e ancora ottenere questo errore, prova a ricreare il file di classe da zero ma ricordatevi di selezionare la casella di controllo "creare anche file di XIB". Questo collegherà automaticamente alcuni elementi che non sono collegati quando si creano questi file separatamente. Dopo che questo è stato creato, puoi probabilmente tagliare e incollare tutto sul nuovo XIB e dovrebbe funzionare correttamente.

mi sto trovando questo problema in particolare con la creazione di file separatamente in Swift.

+0

Grazie, ho avuto un tale problema, ma quando lo ho ricreato con xib tutto funziona! –

+1

Anch'io. Grazie, anche a Travis – Verticon

+0

, ho bisogno di ricreare entrambi fiile, non lavorare con file separati e collegare uiview a swift. –

1

Ho avuto lo stesso problema, la mia seconda vista sul mio controller della vista non poteva caricare. Ho cambiato il nome della vista in proprietà (come avevo precedentemente indicato "View").Il tuo controller di visualizzazione esistente aveva già riferimenti alla vista su di esso con lo stesso nome (Visualizza). Quindi l'errore. Prova a cambiare i nomi delle prese. Ha funzionato perfettamente nel mio caso.

Problemi correlati