我有一個旋轉木馬,每個轉盤項目包含一個獨特的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
串負荷的傳送帶上添加的項目。如果我嘗試在viewdidload
,viewwillappear
或view 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)
}
}
}
你試過tableView.reloadData()'表視圖中的數據正在改變? – faircloud
這不是我遇到的桌面問題,它是他們所在的旋轉木馬。重新加載旋轉木馬不起作用。 – Wazza
如果您可以發佈其他相關代碼,這將有所幫助。未更新的用戶界面可以通過使用GCD庫將UI更新發送到主線程和/或從主線程派遣其他工作以防止其被阻止來輕易修復 – MikeG