为未加载的分段数据做好准备



我有一个转盘,每个转盘项目都包含一个唯一的表视图。当您点击添加按钮时,它会将您带到一个新的视图控制器,这样您就可以为表视图命名并关联要在每个单元格中显示的项目。现在,当我点击保存按钮时,它会执行返回转盘的视图控制器的分段。我的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。我是新手,不确定发生了什么,所以我不知道该使用什么代码。我对两个视图控制器都使用情节串连板,并且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)
}

检索新的billSplitter:

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
}

因此,当按下save时,它要么将现有的"billSplitter"更新为核心数据,要么添加一个新的,然后调用performSegue。在prepareForSegue中,它从CoreData获取所有"billSplitter",并将它们传递给目标视图控制器。

我认为,如果NSManagedObjectContextDidSave观察员在收到通知后调用performSegue,但没有任何更改,可能会有所帮助。

更新:

我在saveButtonWasPressed方法中尝试了以下内容。当视图控制器加载时,它会快速显示旧的转盘,然后闪烁并显示更新的转盘。我不知道从这里到哪里去。

@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)
}
}
}

我可能不明白你到底在问什么,但我唯一的输入是,当我使用prepare for segue时,我总是使用segue标识符

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
}

你在故事板中声明你的标识符,也要确保你的片段是一个动作片段

最新更新