У меня есть карусель, и каждый элемент карусели содержит уникальное табличное представление, и когда вы нажимаете кнопку добавления, вы попадаете на новый контроллер вида, чтобы вы могли дать tableview имя и ассоциировать элементы с отображение в каждой ячейке. Теперь, когда я нажимаю кнопку «Сохранить», он выполняет переход к каруселю viewcontroller. Моя prepareforsegue
выглядит следующим образом:Подготовьте для segue данные, которые не загружаются
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, и 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
он извлекает все «billSplitters» из coredata и передает их в контроллер представления назначения.
Я подумал, что обозреватель NSManagedObjectContextDidSave
может помочь, если он вызвал performSegue
после получения уведомления, но ничего не изменилось.
Update:
Я попытался следующим в моем saveButtonWasPressed
methodwhich когда ViewController нагрузка, быстро показана старой карусели на щелчки и показывает обновленную карусель. Я не уверен, куда идти отсюда.
@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 для отправки обновления пользовательского интерфейса в основной поток и/или отправки другой работы из основного потока, чтобы предотвратить его блокировку. – MikeG