【问题标题】:fatal error on calling function from another class从另一个类调用函数时出现致命错误
【发布时间】:2015-08-14 10:48:01
【问题描述】:

我在从其他类调用函数时遇到问题。我有这个:

class ViewController: UIViewController {

    func addToOrder(orderNumber:String) {

        orderCount.text = orderNumber

    }

}

现在在我的另一个班级:

class TableViewController: UITableViewController {

   func addToOrder(button: UIButton) {


      ViewController().addToOrder("100")

      //I also tried

       var menu = ViewController()
       menu.addToOrder("100")

     }

}

我在这条线上遇到了错误

    orderCount.text = orderNumber

出现此错误:

致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • MenuController() 是一个构造函数调用,所以MenuController().addToOrder("100") 每次都会创建一个新的 MenuController(),这是你想要的吗?
  • 你正在实例化MenuController 的一个新实例,所以大概它的任何属性都不会被初始化
  • 我已经更新了我的问题,我忘了把原来的类名 MenuController 改成 ViewController

标签: ios xcode swift


【解决方案1】:

您可以为此使用NSNotificationCenter。

按照这个步骤:

首先在你想要更新文本的第一个 viewController 中添加这个:

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshTable:", name: "refresh", object: nil)

}

当你加载你的第一个视图时,它会添加一个观察者,并添加这个助手方法,当你回到这个视图时会调用它:

func refreshTable(notification: NSNotification) {
    let orderDetail = NSUserDefaults.standardUserDefaults().integerForKey("order")  //this will read your integer which you will save on second view.
    orderCount.text = "\(orderDetail)"

}

当您返回上一个视图时,在下一个视图中添加此代码。

@IBAction func goBack(sender: AnyObject) {
    //store your int here
    NSUserDefaults.standardUserDefaults().setInteger(100, forKey: "order")
    //send notification to first view.
    NSNotificationCenter.defaultCenter().postNotificationName("refresh", object: nil, userInfo: nil)
    self.dismissViewControllerAnimated(true, completion: nil)
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    它是orderCount(可能是一个UILabel),它在初始化时是nil。如果这是在情节提要中创建的 IBOutlet,则需要将文本存储为单独的属性,并在“viewDidLoad”方法中将 Label 的文本设置为此属性

    【讨论】:

    • 是的,但是此时 ViewController().addToOrder("100") , orderCount 仍然是 nil 因为您的视图尚未加载。如果你在这两个地方添加一些NSLog statments,你就会明白我的意思。
    • 我在调用它的动作中做了ViewController().orderCount.text = "0" 和ViewController().addToOrder("100")。但还是一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多