如何防止子视图释放后,呼叫删除fromsuperview



我想在单击按钮时使用两个子视图更改,该子视图是由故事板创建的,每个子视图都有一个按钮,单击按钮将带来另一个子视图和隐藏的当前一个。但是我发现,当一个子视图call remove fromsuperview((时,它将自动发布,如果我想稍后使用此子视图,我需要一个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
    }
}

没有两个温度var,子视图将在RemoveFromSuperView之后发布,并导致下一个InsertSubView崩溃,因为它是零。那么,如何防止子视图自动发布?有其他方法可以在故事板优雅创建的两个子视图之间进行更改?

我的错误,我没有注意到插座很虚弱,一切都是合理的,当remove fromsuperview,没有比自动释放的强烈观点。

您可以使用 @IBOutlet var secondView: UIView!来创建视图的强参考。但是根据您的要求,我建议不要从超级视图中删除它。代替您应该在需要时隐藏并显示视图。

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
}
}

假设您的两个视图在上方是一种,具有相同的宽度和相同的高度。在ViewDidload中。首先将第一视图设置为正面和第二视图。单击按钮后,我将第二视图带到正面和第一视图。

import UIKit
class ViewController1: UIViewController {
    @IBOutlet var secondView: UIView!
    @IBOutlet var firstView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.bringSubview(toFront: firstView)
        self.view.sendSubview(toBack: secondView)
    }
    @IBAction func moveToSecond(_ sender: UIButton) {
        self.view.bringSubview(toFront: secondView)
        self.view.sendSubview(toBack: firstView)
    }
    @IBAction func moveToFirst(_ sender: UIButton) {
        self.view.bringSubview(toFront: firstView)
        self.view.sendSubview(toBack: secondView)
    }
}

如果您的两个子视图处于不同位置。然后,您需要在各自的按钮中隐藏替代视图

      class ViewController: UIViewController {
        @IBOutlet var secondView: UIView!
        @IBOutlet var firstView: UIView!
        override func viewDidLoad() {
            super.viewDidLoad()
            secondView.isHidden = true
            firstView.isUserInteractionEnabled = 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
        }
 }

最新更新