例如我有两个视图控制器 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"
现在正在寻找你的帮助。谢谢
答案 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)
您在加载视图控制器视图之前更新了按钮的标题,因此buttonState
为nil
。将文本分配给字符串属性,然后在视图加载后更新按钮标题。
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。