Swift - 从外部设置 UI 元素



我有这个UIViewController

import UIKit
class UIViewController1: UIViewController {
    @IBOutlet weak var someTitle: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

当我从另一个视图控制器实例化它时,我正在尝试设置someTitle

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.   
    }
    override func viewDidAppear(animated: Bool) {
        let stb = UIStoryboard(name: "Main", bundle: nil)
        let vc1 = stb.instantiateViewControllerWithIdentifier("someSTBID") as! UIViewController1
        vc1.someTitle.text = "My Title" // it fails here!!!!!
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }    
}

它在上面一行失败的原因是我试图强制解开一个 nil 可选,这someTitle.

请告诉我在这种情况下设置someTitle的方法。

您的第二个UIViewController尚未加载,因此someTitle IBOutlet将为零。您有两个选择:

  1. 简单的一个:你强制加载第二个UIViewController,例如:vc1.view就足够了,然后你设置它(我不建议这样做
  2. 正确的选择是:你让第二个UIViewController负责在正确的时间设置自己的标题。如果你需要传递"My title",你可以简单地通过像configureVc(title: String)这样的函数来传递它,或者通过公开一个像var title: String这样的变量,等等,你会someTitle.text = title第二个UIViewController viewDidLoad

你需要它进入超类视图DidAppear吗,因为如果你把它放到超类viewDidLoad()中,它应该可以工作。我希望这对您和未来的观众有所帮助。

相关内容

  • 没有找到相关文章

最新更新