2017-01-30 3 views
0

У меня есть карусель, и каждый элемент карусели содержит уникальное табличное представление, и когда вы нажимаете кнопку добавления, вы попадаете на новый контроллер вида, чтобы вы могли дать 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) 
     } 
    } 

} 
+0

Вы пробовали 'tableView.reloadData()' в представлении таблицы, где данные меняются? – faircloud

+0

Это не та таблица, с которой у меня проблема, ее карусель, в котором они находятся. И перезагрузка карусели не работает. – Wazza

+0

Это поможет, если вы сможете опубликовать остальную часть соответствующего кода. Пользовательский интерфейс, который не обновляется, может быть легко исправлен с помощью библиотеки GCD для отправки обновления пользовательского интерфейса в основной поток и/или отправки другой работы из основного потока, чтобы предотвратить его блокировку. – MikeG

ответ

0

Я не могу понять, что вы спрашиваете точно, но мой единственный вход, что, когда я использую подготовиться к 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 
} 

Ваш возвещать идентификатор в раскадровке, также убедитесь, что ваш segue является действием segue

+0

Это не помогает им бояться. Спасибо хоть – Wazza

Смежные вопросы