カルーセルがあり、各カルーセル項目にユニークなテーブルビューが含まれています。追加ボタンをタップすると、新しいビューコントローラが表示され、テーブルビューに名前を付けることができます。各セルに表示されます。今私が保存ボタンを押すと、それはカルーセルviewcontrollerに戻るsegueを実行します。私prepareforsegue
は、次のようになります。カルーセルビューコントローラは、それがallBillSplitters
配列からロードカルーセルに追加された項目を表示しません表示されているセグデータがロードされないように準備する
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
}
。 viewdidload
でカルーセルを再読み込みしようとするとviewwillappear
またはview willlayoutsubviews
は何も変わりませんが、それをviewdidlayoutsubviews
で行うと更新されますが、これはうまくいかないことがわかります。デバッグに
私はprepareforsegue
に、アレイを印刷しようとしたし、その後viewdidload
で、それがviewdidload
に追加された項目と同じなしprepareforsegue
で配列を印刷しますが、それが追加された項目とそれらを再度印刷しますが、私はそれを見ることができませんロードされたビューに表示されます。
私はiCarouselを使用しています。私はこれに新しいと何が起こっているのか分からないので、私はどのようなコードを使用するか分からない。私は両方のviewcontrollersのためにストーリーボードを使用しており、segueはボタン自体ではなくビューに関連付けられています。どんな助けも素晴らしいだろう。ありがとう!
詳細情報:新しいbillSplitters取得
@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)
}
:だから
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
}
それはcoredataに既存の 'billSplitter' を更新したり、新しいものを追加していずれかの保存を押し、その後、performSegue
を呼び出し、 prepareForSegue
で、それはcoredataからすべての 'billSplitters'を取り出し、それらをデスティネーションビューコントローラに渡します。
オブザーバーは、通知が届いても何も変更されていないと、performSegue
を呼び出すと助けになると思っていました。
更新:のViewController負荷私は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
これは、関連するコードの残りの部分を投稿できる場合に役立ちます。更新されないUIは、GCDライブラリを使用してUIアップデートをメインスレッドにディスパッチしたり、メインスレッドから他のワークをディスパッチしてブロックされないようにすることで簡単に修正できます。 – MikeG