我要更改两个子视图,因为单击了按钮,该子视图是由StoryBoard创建的,每个子视图都有一个按钮,单击该按钮将带来另一个子视图并隐藏当前的一个子视图。
但是我发现当子视图调用removeFromSuperview()时,它将自动释放,如果以后要使用此子视图,则需要一个var来指向它。
这是我的代码:

class ViewController: UIViewController {

    @IBOutlet weak var secondView: UIView!
    @IBOutlet weak var firstView: UIView!
    var temp1: UIView?
    var temp2: UIView?
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        temp1 = firstView
        temp2 = secondView
        secondView.removeFromSuperview()
    }
    @IBAction func moveToSecond(_ sender: UIButton) {
        firstView.removeFromSuperview()
        view.insertSubview(secondView, at: 0)
        secondView.isUserInteractionEnabled = true
    }
    @IBAction func moveToFirst(_ sender: UIButton) {
        secondView.removeFromSuperview()
        view.insertSubview(firstView, at: 0)
        firstView.isUserInteractionEnabled = true
    }
}

如果没有两个临时变量,则子视图将在removeFromSuperview之后释放,并由于nil导致下一次insertSubview崩溃。
那么,如何防止子视图自动释放呢?
还有另一种在StoryBoard graceful创建的两个子视图之间进行切换的方法吗?

我的错误,我没有注意到插座很弱,一切都合理,当removeFromSuperview时,子视图没有任何优点,而是它自动释放。

最佳答案

您可以使用@IBOutlet var secondView: UIView!创建视图的强引用。但是根据您的要求,我建议不要从 super 视图中删除它。取而代之的是,您应该在需要时隐藏并显示视图,如下所示。

class ViewController: UIViewController {

@IBOutlet var secondView: UIView!
@IBOutlet var firstView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    secondView.isHidden = true
}
@IBAction func moveToSecond(_ sender: UIButton) {
    firstView.isHidden = true
    secondView.isHidden = false
    secondView.isUserInteractionEnabled = true
}
@IBAction func moveToFirst(_ sender: UIButton) {
    secondView.isHidden = true
    firstView.isHidden = false
    firstView.isUserInteractionEnabled = true
}
}

10-07 19:55
查看更多