【问题标题】:How do I rename a button title set from another view controller (Swift 3)如何从另一个视图控制器重命名按钮标题集(Swift 3)
【发布时间】:2018-01-21 01:22:19
【问题描述】:

我正在尝试通过在 ViewController2 中使用 addTarget 的完成函数并在 ViewController1 中引用一个会更改按钮标题的函数来从 ViewController1 设置按钮标题。我遇到的问题是按钮标题在出现 ViewController1 或 ViewController1 上的按钮触发 setButtonText() 函数之前不会改变。如果有人可以帮助解释和解决这个问题,那就太棒了!提前致谢。

视图控制器 1:

override func viewDidLoad() {
    super.viewDidLoad()
    buttonA.setTitle("FirstEdit", for: .normal)
    newViewController.addTarget(self, action: #selector(newVCHandler), for: .touchUpInside)
}

func newVCHandler(){
    present(ViewController2(), animated: true, completion: nil)
}

func setButtonText(){
    buttonA.setTitle("\(Title.buttonA)", for: .normal)
}

视图控制器 2

override func viewDidLoad() {
    super.viewDidLoad()
    newTitleTextField.placeholder = "Set New Title"
    dismissButton.setTitle("Save and Dismiss", for: .normal)
    dismissButton.addTarget(self, action: #selector(dismissHandler), for: .touchUpInside)
}

func dismissHandler(){
    dismiss(animated: true, completion:{
    ViewController1().setButtonText()
})

【问题讨论】:

  • 您的问题是双重的。首先,在解除动画完成(或被取消)之前,完成块不会执行。其次,您正在实例化 ViewController1 的新实例,而不是在现有实例上调用 setButtonText

标签: ios swift


【解决方案1】:

Samah 在他们的评论中给了你答案。

只要你有ClassName() 形式的代码,你就在调用一个初始化器并创建一个新的类实例。这就像买一辆新车,在收音机上设置电台,丢弃新车,然后想知道为什么旧车收音机上的电台没有改变。

您的行 ViewController1().setButtonText() 正在创建一个不在屏幕上的 ViewController 的新实例,并在该新实例上调用 setButtonText。

您需要从视图控制器 2 中引用另一个视图控制器(您称之为视图控制器 1)。为了帮助我们解决这个问题,您必须解释这些视图控制器是如何创建的。

【讨论】:

  • 这在逻辑上是有道理的。我对 Swift 还很陌生,我正在尝试在没有情节提要的情况下以编程方式构建所有内容。如何显示视图控制器是如何创建的?您要完整的课程吗?
  • 嗨@Skiddswarmik! Duncan_C 是对的。通过 ViewController1(),您正在创建 ViewController1 类的新实例。您必须将 viewController1 的实例传递给 viewController2,然后将该实例用于 setButtonText()。
  • 不知何故你有一个流程,首先你显示一个视图控制器,用户采取一些行动,然后你创建并显示第二个视图控制器。那时,第一个视图控制器知道第二个。是时候在视图控制器之间保存指针了,这样它们就可以相互通信了。
【解决方案2】:

试试这个:

    //ViewController 1:

    override func viewDidLoad() {
        super.viewDidLoad()
        buttonA.setTitle("FirstEdit", for: .normal)
        newViewController.addTarget(self, action: #selector(newVCHandler), for: .touchUpInside)
    }

    func newVCHandler(){
        let vc2 = ViewController2() //Create new instance of ViewController2 and save it in variable
        vc2.refvc1 = self //save ViewController1 reference in variable
        present(vc2, animated: true, completion: nil)
    }

    func setButtonText(){
        buttonA.setTitle("\(Title.buttonA)", for: .normal)
    }

    //View Controller 2

    var refvc1: ViewController1?
    override func viewDidLoad() {
        super.viewDidLoad()
        newTitleTextField.placeholder = "Set New Title"
        dismissButton.setTitle("Save and Dismiss", for: .normal)
        dismissButton.addTarget(self, action: #selector(dismissHandler), for: .touchUpInside)
    }

    func dismissHandler(){
        dismiss(animated: true, completion:{
            self.refvc1.setButtonText()
        })

【讨论】:

    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多