2016-03-19 2 views
0

Ich habe ein altes Projekt hochgezogen, das versucht, einige Funktionalität wiederzuverwenden. Ich habe eine Feder mit einer UIView-Unterklasse erstellt. In der ursprünglichen, funktionierenden Version musste ich File's owner in IB nicht einstellen. Ich empfange jedoch Fehler, die ich jetzt tun muss (Xcode 7): loaded the "TipView" nib but the view outlet was not set.Der Versuch, eine Feder programmatisch zu laden, die unzählige Fehler empfängt, die in Xcode 6 nicht angetroffen wurden

So fuhr ich fort, die File's owner bis zu dem View-Controller, der für die Einrichtung der Ansicht verantwortlich ist. Hier ist der relevante Code aus dem View-Controller:

class TipViewController: UIViewController { 

    private let kTipViewHeight: CGFloat = 400 
    private let kTipViewWidth: CGFloat = 300 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    if let tipView = createTipView() { 
     let center = CGPoint(x: CGRectGetWidth(view.bounds)/2, y: CGRectGetHeight(view.bounds)/2) 
     tipView.center = center 
     view.addSubview(tipView) 
    } 
    } 

    func createTipView() -> UIView? { 
    if let view = UINib(nibName: "TipView", bundle: nil).instantiateWithOwner(nil, options: nil).first as? TipView { 
     view.frame = CGRect(x: 0, y: 0, width: kTipViewWidth, height: kTipViewHeight) 
     return view 
    } 
    return nil 
    } 

} 

extension UIViewController { 
    func presentTips(tips: [Tip], animated: Bool, completion: (() -> Void)?) { 
    let controller = TipViewController() 
    controller.modalTransitionStyle = .CrossDissolve 
    presentViewController(controller, animated: animated, completion: completion) 
    } 
} 

Ich habe versucht Einstellung instantiateWithOwner zu: .instantiateWithOwner(self, options: nil).first (geändert nil-self) auch ohne Erfolg.

Dies ist relevant Presenting-View-Controller-Code:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    presentTips([], animated: true, completion: nil) 
} 

Die UIView Unterklasse alles tun, nicht aus dem Üblichen, so habe ich nicht schließen sein Code gestört.

Wenn ich die Änderungen angefordert - füge TipViewController als Datei Besitzer Spitze und Haken seinen view Ausgang an die Spitze Ansicht - ich bekomme eine Reihe von Fehlermeldungen, auf den Konfigurationen abhängig von Mir nehme hin:

this class is not key value coding-compliant for the key view. Can't add self as subview

nicht sicher, warum ich in der Lage war, eine Feder zu verwenden, ohne eine Datei des Besitzers in Xcode 6, aber ich bin nicht in der Lage 7, um von Xcode zu tun - gefunden haben kein Material oder Notizen bezogen auf die Veränderung freigeben, also bin ich jetzt ein wenig ratlos.

Jede Hilfe wird sehr geschätzt.

Antwort

2

So zum View-Controller Ich ging auf die Datei Besitzer Haken, die für den Aufbau der Ansicht

Nein, Sie waren das erste Mal richtig verantwortlich ist. Ihr Problem ist, dass es in iOS 8 einen Bug gab, der mit den Namen von Nibs zu tun hatte, er wurde in iOS 9 behoben und Sie wurden im Netz gefangen, weil der Bug ironischerweise davor geschützt hat, über dieses Problem zu stolpern.

tun:

  • der Datei Besitzer als NSObject konfiguriert verlassen.

  • Schließen Sie keine Ausgänge des Eigentümers der Datei an die Ansicht in der Schreibfeder an; Wenn es eine solche Steckdose gibt, löschen Sie sie.

  • Laden Sie die Feder mit einem nil Besitzer, gerade wie Sie tun.

  • (Bereit für diese? Das ist der Schlüssel :) Benennen Sie die Schreibfeder um. Nennen Sie es nicht TipView.xib. Dieser Name war der Grund für das ganze Problem, mit dem Sie versucht haben, zu arbeiten. Rufen Sie es an, sagen wir TipViewNib.xib. Überarbeiten Sie Ihren Code entsprechend, d. H. Laden Sie die Feder mit nibName: "TipViewNib".

  • Löschen Sie alle Caches einschließlich der Simulator-Version (wie ich hier erklären: How to Empty Caches and Clean All Targets Xcode 4) zu der schlechten Spitze loszuwerden (die mit dem Namen TipView.xib).

Ihre Probleme werden dann verdunsten wie Morgennebel.

+0

Danke für den Eingang @matt. Das hat es für mich nicht gelöst. Aber ich bin mir sicher, dass es das für andere auflösen wird. –

+0

Ich bin sicher, was ich sage, ist richtig. Beachten Sie, dass Sie möglicherweise alle Caches _ löschen müssen, bevor dies funktioniert, um die "schlechte" Schreibfeder (die mit dem TipView-Namen) loszuwerden. Siehe http://StackOverflow.com/questions/5714372/how-to-empty-caches-and-clean-all-targets-xcode-4/6247073#6247073 Wenn das nicht funktioniert, können Sie mindestens die relevanten posten Stück des Projekts auf GitHub? Ich werde es für dich reparieren. – matt

+0

Das Löschen der Caches wurde als Schritt hinzugefügt. Das ist entscheidend. Sie haben wirklich alles vermasselt, indem Sie diesen Namen verwendet haben und es wird etwas Arbeit brauchen, um sie zu lösen. – matt

Verwandte Themen