Geladene Feder, aber der 'View'-Ausgang wurde nicht eingestellt

742

Ich habe meinem Projekt eine neue NIB-Datei hinzugefügt und versucht, sie zu laden.

Wenn ich jedoch auf das Symbolleistensymbol klicke, das mich zu der von mir erstellten Ansicht führen soll, wird folgende NSInternalInconsistencyExceptionMeldung angezeigt:

Beenden der App aufgrund der nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: '- [UIViewController _loadViewFromNibNamed: bundle:] hat die Schreibfeder "..." geladen, aber der Ansichtsausgang wurde nicht festgelegt.'

Also habe ich meine NIB-Datei geöffnet und sehe für die Ansicht, dass keine Referenzierungs-Outlets festgelegt sind. Ich versuche jedoch, auf den Kreis für "New Referencing Outlet" zu klicken und ihn auf den Eigentümer der Datei zu ziehen, aber ich kann nicht ... was muss ich tun, damit meine Ansicht angezeigt wird?

John
quelle
1
Versuchen Sie zuerst, den Build zu reinigen.
LetynSOFT
In meinem Fall war der eigentliche Fehler, dass ich in viewController eine Methode definiert habe (- (void) setValue: (NSNumber *) value forKey: (NSString *) key), die die ViewController-Methode überschreibt, die den Fehler verursacht. Ich habe das Umbenennen dieser Methode gelöst
Christian Mini

Antworten:

1807

Ihr habt Recht, aber da ich ein Neuling bin, habe ich eine Weile gebraucht, um alle Schritte herauszufinden, um das zu tun. Folgendes hat bei mir funktioniert:

  • Öffnen Sie die XIB-Datei, die Probleme verursacht
  • Klicken Sie auf das Eigentümersymbol der Datei in der linken Leiste (das obere sieht aus wie ein gelb umrandetes Feld).
  • Wenn Sie die rechte Seitenleiste nicht sehen, klicken Sie auf das dritte Symbol über "Ansicht" in Ihrer Symbolleiste. Dies zeigt die rechte Seitenleiste
  • Klicken Sie in der rechten Seitenleiste auf die dritte Registerkarte, die ein bisschen wie eine Zeitung aussieht
  • Stellen Sie unter "Benutzerdefinierte Klasse" oben sicher, dass Klasse der Name des ViewControllers ist, der dieser Ansicht entsprechen soll. Wenn nicht, geben Sie es ein
  • Klicken Sie in der rechten Seitenleiste auf die letzte Registerkarte, die wie ein Kreis mit einem Pfeil aussieht
  • Sie sollten "Steckdosen" mit "Ansicht" darunter sehen. Ziehen Sie den Kreis daneben auf das Symbol "Ansicht" in der linken Leiste (das untere sieht aus wie ein weißes Quadrat mit einem dicken grauen Umriss
  • Speichern Sie die xib und führen Sie sie erneut aus
Josh Justice
quelle
Ich habe dieses Problem auch bei Kakao festgestellt. Solange die Ansicht nicht geladen / zur Ansichtshierarchie hinzugefügt wurde, waren alle Ansichtsausgänge NIL. Nach dem Aufruf von addSubview oder ähnlichem wurden alle Steckdosen verbunden. Der lustige Teil meiner Geschichte war, dass po viewcontroller.view.subviews die fehlenden Objekte zeigte.
Apoc
11
Diese Lösung funktioniert in Xcode 7.3 ab Schritt 4 und 5 nicht mehr. Ziehen Sie stattdessen im Interface Builder bei gedrückter Ctrl-Taste vom Eigentümer der Datei in Ihre Ansicht.
PeiweiChen
2
Hat bei mir nicht funktioniert (kein Abschnitt mit den Steckdosen im Verbindungsinspektor, daher keine "Ansicht" unter den Steckdosen, zu denen eine Verbindung hergestellt werden soll), aber +1 für den Aufwand, den Sie in Ihre Antwort gesteckt haben. :)
William T. Mallard
2
Wenn in den Ausgängen keine "Ansicht" angezeigt wird, können Sie auch vom Dateieigentümer in die Ansicht im Storyboard ziehen. Ein Kontextmenü sollte mit einer "Ansicht" -Option erscheinen
Josef
1
@ WilliamT.Mallard Ich habe das gleiche Verhalten. MyViewControllerist eine Unterklasse von Unterklasse von UIViewControllerund es gibt keine viewunter "Outlets". Wenn ich MyViewControllerdirekt aus UIViewControllerder Ansicht eine Unterklasse habe, erscheint unter "Outlets". Magie oder Fehler von Xcode.
user2319066
201

Dies ist der Vorschlag von Josh Justice, aber auf grafische Weise (Bilder sind meine):

  1. Wählen Sie Dateibesitzer
  2. Wählen Sie auf der rechten Seite die benutzerdefinierte Klasse aus.
  3. Geben Sie den benutzerdefinierten Klassennamen ein

Geben Sie hier die Bildbeschreibung ein

  1. Wählen Sie auf der rechten Seite Oultets aus
  2. Ziehen Sie den Ansichtsausgang, um die Komponente anzuzeigen

Geben Sie hier die Bildbeschreibung ein

Schließlich wird der View Controller mit dem fortlaufenden Code instanziiert:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];
Javier Calatrava Llavería
quelle
1
Danke Javier Calatrava Llavería ... hat mir sehr geholfen, nachdem ich mir eine Stunde lang den Kopf geschlagen habe !!!
BharathRao
un exito muchas gracias
Bruno Sosa Fast Tag
Ich habe den 5. Schritt verpasst
hamada147
73

Ich kann das Problem im Allgemeinen beheben, indem ich die Verbindung zwischen dem Eigentümer der Datei und der Ansicht wieder herstelle. Ziehen Sie bei gedrückter Ctrl-Taste vom Eigentümer der Datei in Ihre Ansicht (in IB) und wählen Sie die Ansicht aus dem Einblendmenü aus.

Rohit Mandiwal
quelle
62

Die Ansicht Identität - Klassenidentität wurde nicht festgelegt. Nachdem Sie die entsprechende Klasse festgelegt hatten, wurde das Problem behoben.

John
quelle
Hallo @ John, ich habe das getan, bekomme aber immer noch diese Ausnahme.
Mansuu ....
29

Sind Sie sicher, dass der Eigenschaft "view" Ihres ViewControllers eine UIView (oder Unterklasse) zugewiesen ist?

Klicken Sie mit der rechten Maustaste auf "Dateibesitzer" im linken Bereich der xib für Ihren ViewController und überprüfen Sie, ob der Ausgang "Ansicht" eingestellt ist. Wenn nicht, setzen Sie es auf eine Ansicht!

Dadurch wird das Problem definitiv behoben

Shehbaz Khan
quelle
2
Klare, prägnante Antwort.
Sark9012
15

Für mich all die hier genannten Dinge https://stackoverflow.com/a/6395750/939501 wahr, aber es wurde immer noch ein Fehler ausgelöst. Grund dafür war, dass ich eine View-Klasse mit dem Namen ABCView erstellt und sie später gelöscht und einen View-Controller als hinzugefügt habe ABCViewController, also bezog es sich irgendwie auf altes ABCView im neuen View Controller. Ich musste den ABCViewController löschen und einen neuen mit einem anderen Namen hinzufügen, der mein Problem löste.

Vielen Dank

Vishal Dharankar
quelle
Immer noch ein Fehler im Jahr 2020.
Tamás Sengel
15

Ich hatte das gleiche Problem mit XCode 4.6.3. Ich hatte mit ein paar Dateien begonnen, die benannt MySettingsView.hund .maber zugunsten von gelöscht wurden MySettingsViewController.h, aber obwohl ich die meisten der hier erwähnten Hinweise ausprobiert hatte, machte ich immer noch Fehler mit:

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: '- [UIViewController _loadViewFromNibNamed: bundle:] hat die Schreibfeder "MySettingsView" geladen, aber den View Outlet wurde nicht gesetzt. '

Es war offensichtlich immer noch "verwirrt" und versuchte, MySettingsView.xib anstelle von MySettingsView Controller zu laden .xib . Vielleicht ist die Logik "Mach was ich meine" zu ausgefallen.

Also habe ich das Problem umgangen, indem ich den NIB / XIB-Namen in MySettingsViewController.m fest codiert habe:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}
Nathan
quelle
10

Wenn Sie eine xib-Methode zum Erstellen einer UIView verwenden und dieses Problem haben, werden Sie feststellen, dass im Menü "Verbindungsinspektor" keine "Ansicht" angezeigt wird. Wenn Sie jedoch die benutzerdefinierte Klasse "File's Owners" auf einen UIViewController festlegen, wird der Ausgang "view" angezeigt, über den Sie einfach einen Ausgang mit CustomView verbinden können.

manapate
quelle
Genial. Ich danke dir sehr. Dies sollte eine akzeptierte Antwort sein!
Roman
7

Mein Problem dabei wurde dadurch verursacht, dass sich im Klassenordner eine doppelte Schreibfeder befand, für die die Ansicht nicht festgelegt war. xcode schien eine Feder für einen Build auszuwählen und dann die andere, wenn ich das nächste Mal das Projekt baute. Habe gerade den anderen gelöscht. Sieht gut aus. Doh!

Matt
quelle
6

Ich habe gerade mehr als eine Stunde damit verbracht herauszufinden, warum meine Ansichtseigenschaft nicht in meinem Ansichts-Controller festgelegt ist, nachdem ich sie von der Feder aus gestartet habe. Denken Sie daran, "[super initWithNibName ...]" im initWithNibName Ihres View Controllers aufzurufen.

Kamil.S
quelle
5

Ich habe das gerade in meinem behoben. Großes Projekt, zwei Dateien. Einer war "ReallyLargeNameView" und ein anderer war "ReallyLargeNameViewController"

Basierend auf der oben gewählten zweiten Antwort habe ich beschlossen, meinen Build zu bereinigen. Nada, aber ich war immer noch verdächtig von XCode (da ich zwei identische Klassen habe, sollte ich sie abstrahieren, aber eh ...) Also arbeitet man, man nicht. Die Eigentümernamen der Datei sind soweit kopiert und eingefügt, Outlets neu angeschlossen, xCode neu gestartet, immer noch nichts.

Also lösche ich die ähnlich benannte Klasse (die eine Ansicht ist). Bald war der neue Fehler "Steckdose innen nicht angeschlossen" buchstäblich "WebView nicht Schlüsselwert" bla ... im Grunde gesagt "Visual Studio ist besser". Wie auch immer ... Ich lösche die kleinere benannte Datei und bam, es funktioniert.

XCode wird durch Dateien mit ähnlichen Namen verwirrt. Und das Projekt ist groß genug, um ein wenig neu gestartet zu werden, das könnte ein Teil davon sein.

Ich wünschte, ich hätte eine technischere Antwort als "XCode ist verwirrt", aber nun, xCode wird an dieser Stelle sehr verwirrt. Nicht verwirrt, so wie ich einem kleinen Kind helfen würde. Es funktioniert jetzt :) Sollte anderen zugute kommen, wenn das oben Gesagte nichts behebt.

Denken Sie immer daran, Ihre Builds zu bereinigen (indem Sie auch den Simulator löschen).

Stephen J.
quelle
4

Ich hatte auch das gleiche Problem und mein Problem war, dass ich der ViewControllers-Schreibfeder eine andere Lokalisierung (Englisch) hinzugefügt habe, damit meine App mit der Lokalisierungsdeutsch die Schreibfeder mit der Lokalisierungs-Englisch nicht finden konnte !! Hoffe das hilft jedem!

Weini
quelle
4

Ich hatte das gleiche Problem, als ich versehentlich die xib-Referenz gelöscht und erneut hinzugefügt habe. Ich habe sie nur behoben, indem ich eine Verbindung zwischen dem Dateieigentümer und der Ansicht hergestellt habe. Stellen Sie außerdem sicher, dass die benutzerdefinierte Klasse Ihres FilesOwner Ihr erwarteter viewController ist.

Nidhin
quelle
3

Für mich wurde das Problem durch einen Anruf verursacht initWithNibName:bundle:. Ich verwende Tabellenansichtszellen aus einer NIB-Datei, um Eingabeformulare zu definieren, die darauf sitzen tableViews. Da ich keine Aussicht habe, macht es keinen Sinn, sich an eine zu binden. Wenn ich initWithStyle:stattdessen die Methode aufrufe und von dort aus die NIB-Datei lade, funktionieren die Dinge wie erwartet.

DaveDude
quelle
3

Die vorherigen Antworten haben das Problem für mich fast gelöst, aber der letzte Schritt fehlte.

  1. Erstellen Sie eine xib- und eine schnelle Datei mit demselben Namen.

Ansicht und schnelle Datei hinzufügen

  1. Legen Sie den Dateieigentümer als UIView-Unterklasse fest.

Geben Sie hier die Bildbeschreibung ein

  1. Ziehen Sie einen Ausgang aus der Ansicht in die UIView-Unterklasse und nennen Sie ihn "contentView".

Fügen Sie die Inhaltsansicht hinzu

  1. Fügen Sie diesen benutzerdefinierten Initialisierer hinzu, damit beim Laden der xib die contentView angehängt wird

Fügen Sie die Inhaltsansicht als Unteransicht hinzu

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Jetzt werden alle von Ihnen hinzugefügten @IBOutlets angehängt.

Prost, Richard

COSMO BAKER
quelle
2

Ich hatte das gleiche Problem, aber es wurde eine etwas andere Lösung gefordert. Das Problem in diesem Fall war eher die Klasse des Dateibesitzers als die Klasse der Ansicht. Um dies einzustellen, musste ich auf das Symbol "Rückwärtswiedergabe" in der unteren linken Ecke des Interface Builder-Fensters klicken. Anschließend wurden Optionen angezeigt, die die Eigenschaften des Dateibesitzers, des Ersthelfers und der Ansicht isolierten. Durch Klicken auf die erste (ein großes transparentes Feld) konnte ich die benutzerdefinierte Klasse wie oben vorgeschlagen festlegen.

Michael Stern
quelle
2

Ich hatte das gleiche Problem, aber es wurde eine andere Lösung gefordert. Das Problem in diesem Fall war, dass die Klasse des Dateibesitzers nicht mit der xib-Datei verbunden war.

user1951454
quelle
2

Ich bin heute Abend auf etwas sehr Ähnliches gestoßen, mit einer Swift UIViewController-Unterklasse. In diesem Fall funktionierte keine der oben genannten Korrekturen, aber die Neuordnung meines Codes hat funktioniert. Net-Net, bei dem eine Erweiterung der Unterklasse vor der Definition der Unterklasse in derselben Datei auftritt, scheint XCode zu verwirren, obwohl es gut kompiliert wurde. Das Update bestand darin, die Erweiterungen nach der Definition der Unterklasse zu platzieren.

Ich habe die Details in einer Antwort auf diese ähnliche Frage veröffentlicht .

Cora Middleton
quelle
2

In meinem Fall der angegebene Initialisierer - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil in der *** ViewController-Klasse implementiert. Selbst wenn ich einen anderen Initialisierer aufrufe, um das Objekt zu initialisieren, wird der angegebene Initialisierer aufgerufen.

Um dieses Problem zu lösen, prüfen Sie, ob dies - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilauch ein geeigneter Weg ist.

lynulzy
quelle
2

Ich bin auf dieses Problem etwas anders gestoßen als auf die anderen Antworten hier.

Wenn ich einfach eine neue xib-Datei erstellt, im Interface Builder einen UIViewController hinzugefügt und die benutzerdefinierte Klasse dieses UIViewController auf meinen View Controller festgelegt habe, führte dies zum Absturz "View Outlet wurde nicht festgelegt". Die anderen Lösungen hier sagen, dass Sie den Ansichtsausgang bei gedrückter Ctrl-Taste in die Ansicht ziehen sollen, aber für mich war der Ansichtsausgang ausgegraut und ich konnte ihn nicht bei gedrückter Ctrl-Taste ziehen.

die ausgegraute View-Steckdose

Ich habe herausgefunden, dass mein Fehler darin bestand, einen UIViewController in Interface Builder hinzuzufügen. Stattdessen musste ich eine UIView hinzufügen und die benutzerdefinierte Klasse des Dateibesitzers auf meinen Ansichtscontroller festlegen. Dann konnte ich den Ansichtsausgang des Dateibesitzers bei gedrückter Ctrl-Taste auf meine neue Ansicht UIView ziehen und alles funktionierte wie es sollte.

Brian Kendig
quelle
1

Hatte gerade den gleichen Fehler in meinem Projekt, aber einen anderen Grund. In meinem Fall hatte ich ein IBOutlet-Setup mit dem Namen "View" in meiner benutzerdefinierten UITableViewController-Klasse. Ich wusste, dass "view" etwas Besonderes ist, weil das ein Mitglied der Basisklasse ist, aber ich dachte nicht, dass View (anderer Fall) auch ein Problem sein würde. Ich denke, einige Bereiche von Cocoa unterscheiden nicht zwischen Groß- und Kleinschreibung, und wahrscheinlich ist das Laden eines Xib einer dieser Bereiche. Also habe ich es einfach in DefaultView umbenannt und jetzt ist alles in Ordnung.

eselk
quelle
1

Wählen Sie den Dateieigentümer aus und öffnen Sie den Identitätsprüfer. Geben Sie den Klassennamen an, dem er entspricht. Wenn keine der oben genannten Methoden funktioniert und Sie den Ansichtsausgang immer noch nicht sehen können, geben Sie dem Eigentümer der Datei einen neuen Referenzausgang. Dann können Sie den Ansichtsausgang sehen. Klicken Sie auf das View Outlet, um eine Verbindung zwischen dem View Outlet und dem Eigentümer der Datei herzustellen. Führen Sie die Anwendung aus, dies funktioniert einwandfrei.

Abhilash Reddy kallepu
quelle
1

In meinem Fall wurde die Ansicht in xib nicht angezeigt. In xib war die Ansicht size = none (4. Registerkarte rechts). Ich setze die Größe auf Freeform und lade xCode neu. view wurde angefochten und ich habe den richtigen Link zu View gesetzt.

OrdoDei
quelle
1

Wenn Sie alles versucht haben und immer noch diese Fehlermeldung erhalten, versuchen Sie, die Klassendatei von Grund auf neu zu erstellen. Denken Sie jedoch daran, das Kontrollkästchen "Auch XIB-Datei erstellen" zu aktivieren. Dadurch werden einige Elemente automatisch verknüpft, die beim separaten Erstellen dieser Dateien nicht verknüpft sind. Nachdem dies erstellt wurde, können Sie wahrscheinlich alles ausschneiden und in das neue XIB einfügen, und es sollte einwandfrei funktionieren.

Ich finde dieses Problem speziell beim separaten Erstellen von Dateien in Swift.

Travis M.
quelle
1

für mich passierte es wann

  • Ich habe eine ViewController-Klasse (.mm / h), die der Nib-Datei zugeordnet ist.
  • UIView von diesem ViewController muss als Unteransicht in die andere Ansicht geladen werden.

  • wir werden so etwas nennen

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

Wo

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Hier fehlte loadView ,,, das Hinzufügen dieser Zeile löste mein Problem.

Amitg2k12
quelle
1

Ich hatte das gleiche Problem, das ich herausgefunden habe, und das liegt daran, dass ich in den Eigenschaften der Tabellenansicht unter " Inhalt" die Option " Statische Zellen " angekreuzt hatte . Funktionierte, als es auf " " geändert wurde . Screenshot ist unten. Dynamic PrototypesGeben Sie hier die Bildbeschreibung ein

Saranjith
quelle
1

Ich hatte ein ähnliches Problem mit Xcode 9.3, und das Festlegen von "Modul" unter dem Attributinspektor "Dateibesitzer" für das Projektmodul hat dies für mich behoben.

Nananta
quelle
1

Öffnen Sie Ihre Storyboard- Datei, in der Ihr viewController vorhanden ist, oder eine XIB- bezogene Datei mit textEdit.app und überprüfen Sie, ob der Storyboard- oder XIB-Name mit Ihrem viewController identisch ist. Ändern Sie ihn dann, speichern Sie Xcode und laden Sie ihn neu und starten Sie ihn neu.

Alessandro Ornano
quelle
1

Wenn Sie eine benutzerdefinierte Init-Methode verwenden, überprüfen Sie, ob Sie etwas Gültiges zurückgeben. Ich bin auf einen Code gestoßen, der auf so etwas abgestürzt ist:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

In einer anderen Klasse wurde der Controller folgendermaßen erstellt:

CustomController *controller = [[CustomController alloc] init];

Das Problem ist, dass sich in der init-Methode self nicht geändert hat und stattdessen so aussehen sollte:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}
Declan Land
quelle
0

Ich möchte Stephen J. unterstützen. Manchmal wird X Code nur verwirrt. Ich hatte gerade eine Erfahrung, in der ich viel mit der Benutzeroberfläche herumgespielt und einige Male Outlets hinzugefügt und gelöscht hatte. Die Steckdosen würden sich einfach nicht mehr verkabeln. Ich habe nie einen bestimmten Grund herausgefunden (ich hatte alle oben genannten Lösungen ausprobiert), und ich musste nur die NIB löschen und von Grund auf neu erstellen und tatsächlich einen anderen Namen für die NIB verwenden, bevor sie funktionieren würde. (XCode 4.6.1) Verschwendete ein paar Stunden damit.

BrianH
quelle