Ios 如何从另一个视图控制器(Swift 3)重命名按钮标题集
我试图通过在ViewController2中使用addTarget的完成函数并引用ViewController1中的一个函数来设置ViewController1中的按钮标题,该函数将更改按钮标题。我遇到的问题是,在显示ViewController1或ViewController1上的按钮触发setButtonText()函数之前,按钮标题不会更改。如果有人能帮助解释和解决这个问题,那就太棒了!提前谢谢 视图控制器1:Ios 如何从另一个视图控制器(Swift 3)重命名按钮标题集,ios,swift,Ios,Swift,我试图通过在ViewController2中使用addTarget的完成函数并引用ViewController1中的一个函数来设置ViewController1中的按钮标题,该函数将更改按钮标题。我遇到的问题是,在显示ViewController1或ViewController1上的按钮触发setButtonText()函数之前,按钮标题不会更改。如果有人能帮助解释和解决这个问题,那就太棒了!提前谢谢 视图控制器1: override func viewDidLoad() { super
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()。不知何故,您有一个流程,首先显示一个视图控制器,用户执行一些操作,然后创建并显示第二个视图控制器。此时,第一个视图控制器知道第二个视图控制器。这是在视图控制器之间保存指针的时间,这样它们就可以相互通信了。