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?
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
Ahh das macht Sinn. Irgendwelche Vorschläge, damit das funktioniert? –
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