Swift:解开时UILabel为零

时间:2017-08-23 00:37:07

标签: ios swift swift3 uilabel

我有一个结构,其中包含有关结账的信息。当用户删除或添加书籍时,我使用did set方法来计算数组中书籍的总数,然后将总数设置为我在另一个类中的标签。问题是,当我尝试将数字设置为标签时,我会在解开可选值时继续获取“nill”我检查了此处发布的其他问题并尝试解决此问题但我无法修复我不确定我是不是做错了或者说我的故事板设置错了

ViewController,它包含struct和数组,并使用didSet监视数组中的更改

 let NewLabel = ViewControllerExtension()
 var ServiceReportArray = [ServiceReport](){
    didSet{
            let sum : [Int] = ServiceReportArray.map{return$0.NumberOfBooks}
            let totalSum = sum.reduce(0){return $0 + $1}
            NewLabel.BooksLabel.text = String(totalSum)

            //NewLabel.Myreload()
            // This function returns the same error
  }
}

这是我的标签所在的类,并创建了要调用的Myreload()函数,而不是仅仅从didSet中提取信息,但仍然得到错误。

class ViewControllerExtension : UIViewController{
@IBOutlet weak var BooksLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
}
func Myreload(){
    let sum : [Int] = ServiceReportArray.map{return $0.NumberOfBooks}
    let totalSum = sum.reduce(0){return $0 + $1}
    BooksLabel.text = String(totalSum)

  }  
}

4 个答案:

答案 0 :(得分:0)

我认为问题在于您只是通过创建NewLabel对象来创建UIViewController变量。 @IBOutlet已链接到storyboard元素,由于您未从故事板创建,BooksLabelnil

我的建议

创建UIViewController的子类(而不仅仅是扩展名)。 (如果扩展程序适合您,您不需要这些,但这就是我的工作)

然后,按如下方式初始化视图控制器:

let storyboard = UIStoryboard(name: "storyboard_name", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "sb_identifier") as! YourViewControllerClass

首先,您需要在故事板中为视图控制器设置标识符。

sbid

希望这有帮助!

答案 1 :(得分:0)

我的建议是

首先确认代码的顺序,是否初始化为执行didSet,执行程序的顺序

随后在StoryBoard设置中检测到ViewControllerExtension,关联的类是否正确,是否存在冗余连接

答案 2 :(得分:0)

如果您要设置应用程序的根视图控制器,则可以执行以下操作:

let viewController = UIApplication.shared.windows[0].rootViewController as? ViewControllerExtension
viewController.BooksLabel.text = String(totalSum)

但是如果您正在申请第一个子视图控制器(childViewControllers[0]),第二个子视图控制器(childViewControllers[1]),那么您可以在下面使用:

let viewController = UIApplication.shared.windows[0].rootViewController?.childViewControllers[0] as? ViewControllerExtension
viewController.BooksLabel.text = String(totalSum)

*这是一种替代解决方案,但不是最佳解决方案。

答案 3 :(得分:0)

好的,所以我想出了什么问题。首先,我的View Controller使用容器视图进入另一个视图控制器(这就是问题所在)。为了解决这个问题,我继续为Container View提供了一个标识符(如下所示) ViewController ID

接下来我去了我的ViewController并添加了它并访问了CreateMyLabel函数,它运行得很好。

var embeddedViewController : MyCustomeTotalCell!

    override func viewDidLoad() {
        super.viewDidLoad()
       self.embeddedViewController.CreateMyLabel()
}



 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? MyCustomeTotalCell,
        segue.identifier == "TotalReport"{ self.embeddedViewController = vc
           }
 }

问题是我需要使用segue,因为它已嵌入到视图控制器中。希望这可以帮助任何有同样问题的人。谢谢大家的帮助。