为什么在呈现视图控制器后将UIView从heirarchy中移除?

时间:2017-06-21 21:19:53

标签: ios swift explain

好的,我只是碰到了奇怪的事情。我的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消失?

1 个答案:

答案 0 :(得分:1)

-addSubview(_:)的文件中:

  

视图只能有一个超级视图。如果视图已经具有超级视图并且该视图不是接收者,则此方法将删除之前的视图   在使接收器成为新的超级视图之前的超视图。

这应该解释你的问题。

我建议您根据自定义样式创建一个生成headerView(每次都是新的)的方法。

如果您真的想要“复制”视图,可以查看that answer。由于UIView不符合 NSCopying ,因此它的“归档/编码”是因为它符合 NSCoding ,复制归档 ,并“解压缩/解码”它的副本。