2017-01-30 9 views
0

カルーセルがあり、各カルーセル項目にユニークなテーブルビューが含まれています。追加ボタンをタップすると、新しいビューコントローラが表示され、テーブルビューに名前を付けることができます。各セルに表示されます。今私が保存ボタンを押すと、それはカルーセル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) 
     } 
    } 

} 
+0

データが変更されているテーブルビューで 'tableView.reloadData()'を試しましたか? – faircloud

+0

それは私が問題を抱えているテーブルビューではなく、彼らが入っているカルーセルです。そして、カルーセルを再ロードすることはできません。 – Wazza

+0

これは、関連するコードの残りの部分を投稿できる場合に役立ちます。更新されないUIは、GCDライブラリを使用してUIアップデートをメインスレッドにディスパッチしたり、メインスレッドから他のワークをディスパッチしてブロックされないようにすることで簡単に修正できます。 – MikeG

答えて

0

私はあなたが正確に求めているが、私の唯一の入力は、私は、私はいつもあなたも、ストーリーボードに自分の識別子を宣言しセグエ識別子

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 
} 

を使用セグエの準備を使用したときということが何であるかを理解していない可能性あなたのセグがアクションセグメであることを確認してください

+0

これは、私の恐れを助けません。ありがとう – Wazza

関連する問題