是否有可能从视图控制器B更改视图控制器A按钮标题?

时间:2017-12-28 07:44:28

标签: ios swift swift3

例如我有两个视图控制器 1. ViewControllerA 2. ViewControllerB

ViewControllerA有一个名为“选择状态”的按钮,id为'buttonState',现在我想在ViewControllerB中更改像“Tamil Nadu”这样的按钮标题。

我已经尝试了以下代码

let vc1 = ViewControllerA()

vc1.buttonState.setTitle("Tamil Nadu", for: .normal)

但它不起作用并且错误是"unexpectedly found nil while unwrapping an Optional value"

现在正在寻找你的帮助。谢谢

4 个答案:

答案 0 :(得分:0)

根据你的问题,我认为我可以理解可能有两种情况

案例1:如果从ViewController B推送ViewController A

因此它将创建该ViewController A的新实例,并且您可以传递任何String并将其设置为标签Title,只需声明一个字符串变量并在推送视图控制器时设置该值

示例(Swift): -

let viewControllerA = self.storyboard?.instantiateViewController(withIdentifier: "viewControllerA") as! viewControllerA

viewControllerA.strBtnTitle = "Tamil Nadu"

self.navigationController?.pushViewController(viewControllerA, animated: true)

案例2:您在ViewController B,并且想要返回ViewController A

因此,在这种情况下,你必须使用Protocol,Delegate For passback数据到之前的ViewController,为此你可以参考下面的链接获取更多信息

Passing Data between View Controllers

如果有帮助,请告诉我。

答案 1 :(得分:0)

您在加载视图控制器视图之前更新了按钮的标题,因此buttonStatenil。将文本分配给字符串属性,然后在视图加载后更新按钮标题。

class ViewControllerA: UIViewController {

   @IBOutlet private weak var buttonState: UIButton!

   var buttonTitle: String?

    viewDidLoad() {
        super.viewDidLoad() {

            buttonState.setTitle(buttonTitle, for: .normal)
        }
    }

}

let vc1 = ViewControllerA()
vc1.buttonTitle = "Tamil Nadu"
// Now present / push vc1

答案 2 :(得分:-1)

尝试在按钮上设置标题之前,请检查此按钮是否已初始化。

如果要从vc1获取buttonState的实例,如let vc1 = ViewControllerA(),则需要在vc1的init()方法中创建buttonState的对象。 当然,如果这个buttonState是从xib / storyboard连接的,那么你需要调用:

let vc1 : ViewControllerA = storyboard.instantiateViewController(withIdentifier: "identifierVCA") as! ViewControllerA

然后:

if let buttonState = vc1.buttonState {
   buttonState.setTitle("Tamil Nadu", for: .normal)
}

答案 3 :(得分:-1)

使用!声明变量时;这意味着你必须非常小心。的?声明变量可以是nil,所以在你的情况下,你必须使用

vc1.buttonState?.setTitle("Tamil Nadu", for: .normal)

现在,只有当vc1.buttonState不是nil时才会执行setTitle。