Изменение UIButton из другого ViewController - PullRequest
0 голосов
/ 02 мая 2019

мне нужно изменить UIButton (статус, заголовок) с другого UIViewController

я попробовал следующее

import UIKit

class ViewController: UIViewController{

    @IBOutlet var B1: UIButton!
    @IBOutlet var B2: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }


}
import Foundation
import UIKit

class View2: UIViewController {
    @IBAction func Dismiss(_ sender: Any) {
        h()

        dismiss(animated: true, completion: nil)
    }


    func h(){
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "VC") as? ViewController
        vc?.loadViewIfNeeded()

        print("c: ",vc?.B1.currentTitle ?? "")
        vc?.B1.setTitle("a", for: .normal)
        print("c: ",vc?.B1.currentTitle ?? "")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Вывод:

c:  V1B1
c:  a

это изменилось (как сказал выход)!но когда представление отклонено, оно возвращается к "V1B1", то есть названию, которое я вставил Main.storyboard

, я также попытался изменить его с помощью протокола и делегировать

import UIKit

class ViewController: UIViewController,TestDelegate {
    func t(NewT: UIButton) {
        NewT.setTitle("a", for: .normal)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dd = segue.destination as? View2 {
            dd.d = self
            print("B1O: ",B1.currentTitle!)
        }
    }

    @IBOutlet var B1: UIButton!
    @IBOutlet var B2: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
import Foundation
import UIKit

protocol TestDelegate {
    func t(NewT: UIButton)
}

class View2: UIViewController {
var d: TestDelegate?

    @IBAction func Dismiss(_ sender: Any) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "VC") as? ViewController
        vc?.loadViewIfNeeded()
        print("B1: ",vc?.B1.currentTitle!)
            d?.t(NewT: (vc?.B1!)!)
        print("B1: ",vc?.B1.currentTitle!)

        dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Вывод:

B1O:  V1B1
B1:  Optional("V1B1")
B1:  Optional("a")

что не так с кодом?

Как я могу изменить UIButtons навсегда, даже если UIViewControllerзагружен снова

Ответы [ 3 ]

1 голос
/ 02 мая 2019
import UIKit

class ViewController: UIViewController{

    @IBOutlet var B1: UIButton!
    @IBOutlet var B2: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    open override func viewWillAppear(_ animated: Bool) {
        // Register to receive notification
        NotificationCenter.default.addObserver(self, selector: #selector(self.updateTitle), name: NSNotification.Name(rawValue: "buttonTitleUpdate"), object: nil)
        super.viewWillAppear(animated)
    }

    @objc func updateTitle() -> Void {
        print("c: ",B1.currentTitle ?? "")
        B1.setTitle("a", for: .normal)
        print("c: ",B1.currentTitle ?? "")
    }

}


import Foundation
import UIKit

class View2: UIViewController {
    @IBAction func Dismiss(_ sender: Any) {

        // Post a notification
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "buttonTitleUpdate"), object: nil)

        dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
0 голосов
/ 02 мая 2019

большое спасибо "RajeshKumar R" и "Bhavesh Nayi"

import UIKit

class ViewController: UIViewController,TestDelegate {
    func t(NewT: Int) {
    let TempButton = self.view.viewWithTag(NewT) as! UIButton
        TempButton.setTitle("X", for: .normal)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dd = segue.destination as? View2 {
            dd.d = self
        }
    }


    @IBOutlet var B1: UIButton!
    @IBOutlet var B2: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
import Foundation
import UIKit

protocol TestDelegate {
    func t(NewT: Int)
}

class View2: UIViewController {
var d: TestDelegate?

    @IBAction func Dismiss(_ sender: Any) {
        //just pass the tag
            d?.t(NewT: 1)
        dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}


0 голосов
/ 02 мая 2019

"это изменилось (как сказано в выходных данных)! Но когда представление отклонено, оно возвращается к" V1B1 ", то есть названию, которое я поместил в Main.storyboard"

Вы изменили заголовок B1 в новом экземпляре V1, а не в существующем экземпляре V1.

Не создавайте новый экземпляр для класса ViewController в методе dismiss

class ViewController: UIViewController,TestDelegate {
    func change(text: String) {
        B1.setTitle(text, for: .normal)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let dd = segue.destination as? View2 {
            dd.d = self
            print("B1O: ",B1.currentTitle!)
        }
    }

    @IBOutlet var B1: UIButton!
    @IBOutlet var B2: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
protocol TestDelegate {
    func change(text: String)
}

class View2: UIViewController {
    var d: TestDelegate?

    @IBAction func Dismiss(_ sender: Any) {
        d?.change(text:"NewTitle")
        dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
...