Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从另一个视图控制器(Swift 3)重命名按钮标题集_Ios_Swift - Fatal编程技术网

Ios 如何从另一个视图控制器(Swift 3)重命名按钮标题集

Ios 如何从另一个视图控制器(Swift 3)重命名按钮标题集,ios,swift,Ios,Swift,我试图通过在ViewController2中使用addTarget的完成函数并引用ViewController1中的一个函数来设置ViewController1中的按钮标题,该函数将更改按钮标题。我遇到的问题是,在显示ViewController1或ViewController1上的按钮触发setButtonText()函数之前,按钮标题不会更改。如果有人能帮助解释和解决这个问题,那就太棒了!提前谢谢 视图控制器1: override func viewDidLoad() { super

我试图通过在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()
})

萨玛在他们的评论中给了你答案

任何时候当您有
ClassName()
格式的代码时,您都在调用初始值设定项并创建该类的新实例。这就像是买了一辆新车,在收音机上设置了电台,丢弃了新车,然后想知道为什么你旧车收音机上的电台没有改变

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


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

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

任何时候当您有
ClassName()
格式的代码时,您都在调用初始值设定项并创建该类的新实例。这就像是买了一辆新车,在收音机上设置了电台,丢弃了新车,然后想知道为什么你旧车收音机上的电台没有改变

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

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

尝试以下方法:

    //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()
        })
试试这个:

    //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()
        })

你的问题是双重的。首先,在解雇动画完成(或取消)之前,完成块不会执行。其次,您正在实例化一个新的
ViewController1
实例,而不是对现有实例调用
setbuttonext
。首先,在解雇动画完成(或取消)之前,完成块不会执行。其次,您正在实例化
ViewController1
的新实例,而不是对现有实例调用
setbuttonext
。这在逻辑上是有意义的。我对斯威夫特相当陌生,我正在尝试在没有故事板的情况下以编程方式构建一切。如何显示视图控制器的创建方式?你想要完整的课程吗?嗨@Skiddswarmik!邓肯是对的。通过ViewController1()可以创建类ViewController1的新实例。您必须将viewController1的实例传递给viewController2,然后将该实例用于setButtonText()。不知何故,您有一个流程,首先显示一个视图控制器,用户执行一些操作,然后创建并显示第二个视图控制器。此时,第一个视图控制器知道第二个视图控制器。这是在视图控制器之间保存指针的时间,这样它们就可以相互通信了。这在逻辑上是有意义的。我对斯威夫特相当陌生,我正在尝试在没有故事板的情况下以编程方式构建一切。如何显示视图控制器的创建方式?你想要完整的课程吗?嗨@Skiddswarmik!邓肯是对的。通过ViewController1()可以创建类ViewController1的新实例。您必须将viewController1的实例传递给viewController2,然后将该实例用于setButtonText()。不知何故,您有一个流程,首先显示一个视图控制器,用户执行一些操作,然后创建并显示第二个视图控制器。此时,第一个视图控制器知道第二个视图控制器。这是在视图控制器之间保存指针的时间,这样它们就可以相互通信了。