好的,我只是碰到了奇怪的事情。我的app控制器依赖项将视图(标题)注入视图控制器。该视图控制器以模态方式呈现另一个视图控制器,并且依赖关系为其呈现视图控制器使用它自己的头部。但当它出现时,第一个控制器的标题消失了。
该属性仍处于设置状态,但已从视图层次结构中删除。
我在新的单一视图项目中重现了这个问题:
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)
}
}
有人能解释一下这里发生了什么吗?为什么sharedView会从FirstViewController消失?
答案 0 :(得分:1)
在-addSubview(_:)
的文件中:
视图只能有一个超级视图。如果视图已经具有超级视图并且该视图不是接收者,则此方法将删除之前的视图 在使接收器成为新的超级视图之前的超视图。
这应该解释你的问题。
我建议您根据自定义样式创建一个生成headerView(每次都是新的)的方法。
如果您真的想要“复制”视图,可以查看that answer。由于UIView
不符合 NSCopying ,因此它的“归档/编码”是因为它符合 NSCoding ,复制归档 ,并“解压缩/解码”它的副本。