2017-01-30 21 views
0

我有一個旋轉木馬,每個轉盤項目包含一個獨特的tableview,當你點擊添加按鈕,它帶你到一個新的視圖控制器,這樣就可以給tableview中的名稱和聯繫項目顯示在每個單元格中。現在,當我點擊保存按鈕時,它將執行segue回到carousels viewcontroller。我prepareforsegue看起來是這樣的:準備賽格瑞數據沒有被加載

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    let destinationVC = segue.destination as! BillSplittersViewController 
    let passedBill: NSManagedObject = bill as NSManagedObject 

    destinationVC.allBillSplitters = getUpdatedSplitters() 
    print(2)    
    print(destinationVC.allBillSplitters) 
    destinationVC.billName = billName 
    destinationVC.bill = passedBill 
} 

當顯示旋轉視圖控制器它並不顯示在從allBillSplitters串負荷的傳送帶上添加的項目。如果我嘗試在viewdidloadviewwillappearview willlayoutsubviews沒什麼變化重裝轉盤,但它更新,如果我在viewdidlayoutsubviews做到這一點,但你可以看到這種情況出現是不是很大。

要調試我試圖打印數組中prepareforsegue,然後在viewdidload並將其打印在陣列中prepareforsegue沒有增加的項目,並在viewdidload相同,但然後將其與添加的項目再次打印他們,但我無法看到它在加載視圖中。

我使用iCarousel是否有幫助。我是新來的,不確定發生了什麼,所以我不知道要使用什麼代碼。我爲兩個viewcontrollers使用storyboard,而segue附加到視圖而不是按鈕本身。任何幫助都會很棒。謝謝!

的更多信息:

@IBAction func saveButtonWasPressed() { 

    let managedContext = bill.managedObjectContext 

    if let splitter = splitter { 
     splitter.mutableSetValue(forKey: "items").removeAllObjects() 
     setBillSplitterValues(splitter) 
     setSelectedItemsToBillSplitter(splitter) 
    } else { 
     let entity = NSEntityDescription.entity(forEntityName: "BillSplitter", in: managedContext!) 
     let newBillSplitter = NSManagedObject(entity: entity!, insertInto: managedContext) 

     setBillSplitterValues(newBillSplitter) 
     setSelectedItemsToBillSplitter(newBillSplitter) 
    } 

    do { 
     try managedContext!.save() 
    } 
    catch let error as NSError { 
     print("Core Data save failed: \(error)") 
    } 

    self.performSegue(withIdentifier: "segueToBillSplitters", sender: self) 
} 

檢索新billSplitters:

func getUpdatedSplitters() -> [BillSplitter] { 
    var allBillSplitters = [BillSplitter]() 

    let managedContext = bill.managedObjectContext 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BillSplitter") 
    let predicate = NSPredicate(format: "ANY bills == %@", bill) 

    fetchRequest.predicate = predicate 

    do { 
     let results = 
      try managedContext!.fetch(fetchRequest) 
     allBillSplitters = results as! [BillSplitter] 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 
    return allBillSplitters 
} 

所以按下保存它或者更新現有的 'billSplitter' 到coredata或添加一個新的時,然後調用performSegue,在prepareForSegue它然後從coredata提取所有'billSplitters',並將它們傳遞到目標視圖控制器。

我以爲NSManagedObjectContextDidSave觀察員可能會幫助,如果它在調用performSegue時收到通知,但沒有任何更改。

更新:

我試圖在我的saveButtonWasPressed methodwhich以下時視圖 - 控制負荷,迅速顯示舊的傳送帶上的筆觸和顯示更新轉盤。我不知道該從哪裏出發。

@IBAction func saveButtonWasPressed() { 

    DispatchQueue.global(qos: .background).async { [weak weakSelf = self] in 
     let managedContext = weakSelf?.bill.managedObjectContext 

     if let splitter = weakSelf?.splitter { 
      splitter.mutableSetValue(forKey: "items").removeAllObjects() 
      weakSelf?.setBillSplitterValues(splitter) 
      weakSelf?.setSelectedItemsToBillSplitter(splitter) 
     } else { 
      let entity = NSEntityDescription.entity(forEntityName: "BillSplitter", in: managedContext!) 
      let newBillSplitter = NSManagedObject(entity: entity!, insertInto: managedContext) 

      weakSelf?.setBillSplitterValues(newBillSplitter) 
      weakSelf?.setSelectedItemsToBillSplitter(newBillSplitter) 
     } 

     do { 
      try managedContext!.save() 
     } 
     catch let error as NSError { 
      print("Core Data save failed: \(error)") 
     } 

     DispatchQueue.main.async { [weak weakSelf = self] in 
      guard let weakSelf = weakSelf else { return } 
      weakSelf.performSegue(withIdentifier: "segueToBillSplitters", sender: self) 
     } 
    } 

} 
+0

你試過tableView.reloadData()'表視圖中的數據正在改變? – faircloud

+0

這不是我遇到的桌面問題,它是他們所在的旋轉木馬。重新加載旋轉木馬不起作用。 – Wazza

+0

如果您可以發佈其他相關代碼,這將有所幫助。未更新的用戶界面可以通過使用GCD庫將UI更新發送到主線程和/或從主線程派遣其他工作以防止其被阻止來輕易修復 – MikeG

回答

0

我可能不明白你問究竟是什麼,但我唯一的輸入是,當我使用賽格瑞準備。我經常用賽格瑞標識符

var valueToPass 
override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if (segue.identifier == "yourSegue") { 
     let viewController = segue.destination as! ViewController 
     viewController.passedValue = valueToPass as String 
} 

你宣佈你在故事板標識符,也確保你的segue是一個行動segue

+0

這沒有幫助我害怕。不過謝謝 – Wazza