简体   繁体   中英

Hiding and showing (subviews) button or change title?

I have a problem with my subviews. I have 2 visible buttons and 1 which should show after click the first one. More Precisely, i have Start Button, Reset Button and Stop Button. On load should show just Start and Reset button, but when I press Start Button the Reset button should hide and stop button should show. Syntax like isHidden doesn't works. What is the problem?

Star, Stop and Reset Button:

 var stopButton: UIButton{

    let stopButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
    stopButton.backgroundColor = .white
    stopButton.setTitle("Stop", for: .normal)
    stopButton.addTarget(self, action: #selector(stopButtonAction), for: .touchUpInside)
    stopButton.layer.cornerRadius = 50
    stopButton.layer.masksToBounds = true
    stopButton.isHidden = true

    return stopButton
}

var resetButton: UIButton{

    let resetButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
    resetButton.backgroundColor = .red
    resetButton.setTitle("Reset", for: .normal)
    resetButton.addTarget(self, action: #selector(resetButtonAction), for: .touchUpInside)
    resetButton.layer.cornerRadius = 50
    resetButton.layer.masksToBounds = true

    return resetButton
}

var startButton: UIButton{

    let startButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
    startButton.backgroundColor = .green
    startButton.setTitle("Start", for: .normal)
    startButton.addTarget(self, action: #selector(startButtonAction), for: .touchUpInside)
    startButton.layer.cornerRadius = 50
    startButton.layer.masksToBounds = true

    return startButton
}

Here i add this Subviews(this func also add UIView and it's called in viewDidLoad):

func addBottomView()
{
    let orginX = (collectionView?.frame.minX)!
    let orginY = (collectionView?.frame.maxY)!
    let heightOfView = view.frame.height - (view.frame.height / 100) * 70

    let bottomView = UIView(frame: CGRect(x: orginX, y: orginY, width: view.frame.width, height: heightOfView))
    bottomView.backgroundColor = .orange

    view.addSubview(bottomView)

    bottomView.addSubview(stopButton)
    bottomView.addSubview(startButton)
    bottomView.addSubview(resetButton)


}

And here are my functions which are connected to this buttons:

  func startButtonAction()
{
    blinkAction()
    print("START ACTION")

    resetButton.isHidden = true
    stopButton.isHidden = false
    view.layoutSubviews()
}

func resetButtonAction()
{
   print("RESET ACTION")
   blinkAction()

}
func stopButtonAction()
{
    print("STOP ACTION")
    blinkAction()

    resetButton.isHidden = false
    stopButton.isHidden = true
    view.layoutSubviews()

}

I add layoutSubviews method but it don't help. I also tried use self before name of button which is hidden but i also doesn't work. Any advice?

The computed properties startButton, stopButton, resetButton are not the SAME items as the ones added as subviews. Computed properties do not store a value, they give you methods to get values and set changes. So the actions you take there with isHidden do not apply to your view.

The reason of isHidden property not working well is that when your computed property variable you get a new instance of UIButton rather than old one. If you want to want to use computed properties then you should create lazy properties. So whenever you call property variable you'll get old one instance of UIButton .

Your properties always create new buttons, so your references will not be the same. When you set the isHidden, your button will be re-created so you set the isHidden propery of another button that is not added to bottomView.

Just use plain properties:

var stopButton: UIButton!
var resetButton: UIButton!
var startButton: UIButton!

Create the buttons:

func createButtons() {

let stopButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
stopButton.backgroundColor = .white
stopButton.setTitle("Stop", for: .normal)
stopButton.addTarget(self, action: #selector(stopButtonAction), for: .touchUpInside)
stopButton.layer.cornerRadius = 50
stopButton.layer.masksToBounds = true
stopButton.isHidden = true

let resetButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
resetButton.backgroundColor = .red
resetButton.setTitle("Reset", for: .normal)
resetButton.addTarget(self, action: #selector(resetButtonAction), for: .touchUpInside)
resetButton.layer.cornerRadius = 50
resetButton.layer.masksToBounds = true

let startButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
startButton.backgroundColor = .green
startButton.setTitle("Start", for: .normal)
startButton.addTarget(self, action: #selector(startButtonAction), for: .touchUpInside)
startButton.layer.cornerRadius = 50
startButton.layer.masksToBounds = true
}

Add as subviews:

bottomView.addSubview(stopButton)
bottomView.addSubview(startButton)
bottomView.addSubview(resetButton)

And use them:

resetButton.isHidden = false
stopButton.isHidden = true

You can create button using computed properties with lazy keywoard

lazy var stopButton: UIButton = {
        let stopButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
        stopButton.backgroundColor = .yellow
        stopButton.setTitle("Stop", for: .normal)
        stopButton.addTarget(self, action: #selector(stopButtonAction), for: .touchUpInside)
        stopButton.layer.cornerRadius = 50
        stopButton.isHidden = true
        stopButton.layer.masksToBounds = true
        return stopButton
    }()

    lazy var resetButton: UIButton = {
        let resetButton = UIButton(frame: CGRect(x: 220, y: 50, width: 100, height: 100))
        resetButton.backgroundColor = .red
        resetButton.setTitle("Reset", for: .normal)
        resetButton.addTarget(self, action: #selector(resetButtonAction), for: .touchUpInside)
        resetButton.layer.cornerRadius = 50
        resetButton.layer.masksToBounds = true
        return resetButton
    }()

    lazy var startButton: UIButton = {
        let startButton = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
        startButton.backgroundColor = .green
        startButton.setTitle("Start", for: .normal)
        startButton.addTarget(self, action: #selector(startButtonAction), for: .touchUpInside)
        startButton.layer.cornerRadius = 50
        startButton.layer.masksToBounds = true
        return startButton
    }()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM