2017-08-23 61 views
-1

我有一個Struct包含有關檢出書籍的信息。當用戶刪除或添加書籍時,我使用did set方法來計算數組中的書籍總數,然後將總數設置爲另一個班級中的標籤。問題是,當我嘗試將數字設置爲標籤時,我一直收到一個「nill,同時展開可選值」我檢查了此處發佈的其他問題並嘗試解決此問題,但我無法解決我不確定我是否做財產以後錯誤或者也許我的故事板設置錯誤Swift:UILabel無解包裝

的ViewController持有的結構和數組,並使用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) 

    } 
} 
+0

試用UILabel? –

+0

@NaumanMalik試過它已經不起作用,這可能是因爲我在另一個視圖控制器內使用容器視圖的視圖控制器。 – user3220141

回答

0

好吧,所以我覺得什麼是錯的。首先我的視圖控制器是在另一個視圖控制器內使用容器視圖(這是問題)。爲了解決這個問題我繼續給容器視圖的標識符(如下圖所示) 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,因爲它嵌入到視圖控制器中。希望這可以幫助任何有此相同問題的人。謝謝大家的幫助。

0

我認爲,問題是,你是剛剛創建UIViewController對象創建NewLabel變量。 @IBOutlet鏈接到故事板元素,並且由於您不是從故事板創建的,所以BooksLabelnil

我什麼建議

創建的UIViewController一個子類(而不是隻是一個擴展名)。 (如果擴展爲你工作,你不需要這個,但是這就是我做的)

然後,初始化視圖控制器如下:

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

首先,你需要設置一個標識符故事板中的視圖控制器。

sbid

希望這有助於!

+0

剛剛嘗試過,但現在我得到「終止與NSException類型的未捕獲的異常」 – user3220141

0

我的建議是

先確認代碼的順序,它是否被初始化爲執行didSet,程序

的實施其次是檢測ViewControllerExtension在你的故事板設置的順序,關聯類是正確的,是否有冗餘連接

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) 

*這是一種替代解決方案,但不是最好的。

+0

好吧會嘗試。事情是我的視圖控制器是在另一個視圖控制器內,我正在使用容器視圖,並嵌入視圖控制器,所以我不知道如果這就是爲什麼它不工作 – user3220141