2017-01-30 11 views
0

컨베이어가 각 캐 러셀 항목에 고유 한 tableview가 있고 추가 버튼을 누르면 새보기 컨트롤러로 이동하므로 tableview에 이름을 지정하고 항목을 연결할 수 있습니다 각 셀에 표시하십시오. 이제 저장 버튼을 누르면 캐 러셀 뷰 콘트롤러로 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는 버튼 자체가 아닌 view에 붙어있다. 어떤 도움이라도 좋을 것입니다. 감사!

추가 정보 : 새 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을 호출하면 NSManagedObjectContextDidSave 관찰자가 도움이 될 것이라고 생각했습니다.

업데이트 : 나는의 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

나는 당신이 정확히 요구하는 것을 이해하지 않을 수 있습니다하지만 내 유일한 입력 내가 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가 action segue인지 확인하십시오.

+0

이것은 두려운 도움이되지 않습니다. 그래도 고마워 – Wazza