2017-06-21 1 views
2

Ok, ich bin gerade in etwas Bizarres gerannt. Ich habe meine App-Controller-Abhängigkeit, die einen View (Header) in einen View-Controller einfügt. Dieser Ansichts-Controller präsentiert modal einen anderen Ansichts-Controller, und die Abhängigkeit fügt ihren eigenen Header für den zu verwendenden präsentierenden Ansichts-Controller ein. Aber wenn es präsentiert wird, verschwindet der Header vom ersten Controller.Warum wird UIView nach dem Anzeigen des View-Controllers aus der Hierarchie entfernt?

Die Eigenschaft ist noch festgelegt, wurde jedoch aus der Ansichtshierarchie entfernt.

Ich habe dieses Problem in frischen Einzelansicht Projekt wiedergegeben:

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = .white 

     let button = UIButton(frame: CGRect(x: 0, y: 20, width: 100, height: 50)) 
     button.setTitle("Click Me!", for: .normal) 
     button.addTarget(self, action: #selector(self.segue), for: .touchUpInside) 
     button.backgroundColor = .black 
     button.setTitleColor(.lightGray, for: .normal) 

     self.view.addSubview(button) 
    } 

    func segue() { 
     let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
     view.backgroundColor = .lightGray 

     let firstVC = FirstViewController() 
     firstVC.sharedView = view 

     present(firstVC, animated: false) 
    } 
} 

class FirstViewController: UIViewController { 
    var sharedView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = .white 

     self.view.addSubview(self.sharedView) 

     let button = UIButton(frame: CGRect(x: 0, y: 200, width: 100, height: 50)) 
     button.setTitle("Click Me!", for: .normal) 
     button.addTarget(self, action: #selector(self.segue), for: .touchUpInside) 
     button.backgroundColor = .black 
     button.setTitleColor(.lightGray, for: .normal) 

     self.view.addSubview(button) 
    } 

    func segue() { 
     let secondVC = SecondViewController() 
     secondVC.sharedView = self.sharedView 

     present(secondVC, animated: true) 
    } 
} 

class SecondViewController: UIViewController { 
    var sharedView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = .white 

     self.view.addSubview(self.sharedView) 

     let button = UIButton(frame: CGRect(x: 0, y: 200, width: 100, height: 50)) 
     button.setTitle("Click Me!", for: .normal) 
     button.addTarget(self, action: #selector(self.segue), for: .touchUpInside) 
     button.backgroundColor = .black 
     button.setTitleColor(.lightGray, for: .normal) 

     self.view.addSubview(button) 
    } 

    func segue() { 
     self.dismiss(animated: true) 
    } 
} 

Kann jemand erklären, was hier vor sich geht? Warum verschwindet SharedView vom FirstViewController?

+2

Im Dokument von 'addSubview()': 'Ansichten können nur eine Superview haben. Wenn die Ansicht bereits eine Superansicht enthält und diese Ansicht nicht der Empfänger ist, entfernt diese Methode die vorherige Superansicht, bevor der Empfänger seine neue Superansicht erstellt. "Ich denke, das ist das Problem. Sie können dies wollen: https://stackoverflow.com/questions/4425939/can-uiview-be-copied – Larme

+0

Ahh das macht Sinn. Irgendwelche Vorschläge, damit das funktioniert? –

+0

Ich habe meinen vorherigen Kommentar mit einer möglichen Lösung bearbeitet. Aber ich würde eine Methode verwenden, die diese HeaderView mit all Ihren Anpassungen erstellen und aufrufen. – Larme

Antwort

1

Am doc von -addSubview(_:):

Ansichten kann nur ein Super haben. Wenn die Ansicht bereits eine Superansicht enthält und diese Ansicht nicht der Empfänger ist, entfernt diese Methode die vorherige Supervision , bevor der Empfänger seine neue Superview erstellt.

Das sollte Ihr Problem erklären.

Ich würde stattdessen vorschlagen, dass Sie eine Methode erstellen, die eine HeaderView (eine neue jedes Mal) nach Ihrem Anpassungsstil generieren. Wenn Sie wirklich die Ansicht "kopieren" möchten, können Sie that answer überprüfen. Da UIView nicht NSCopying ist konform ist ihr Trick „Archiv/kodieren“ es da es NSCoding konform, kopieren, dass Archiv und „unarchive/decode“ die Kopie davon.

Verwandte Themen