2017-04-19 2 views
0

이미지를 디스크에 저장하는 동안 완료하는 데 몇 초가 걸리는 unwind segue가 있습니다. 보기를 닫을 때까지 활동 표시기를 표시하려고하지만보기가 갱신되지 않습니다. Segue 준비가 완료되면 Swift 3 -보기가 업데이트되지 않습니다.

는 기각되기 전에 뷰 컨트롤러에서 호출 내 기능입니다 :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "saveRecord" { 
     print("indicator") 
     let indicator = UIActivityIndicatorView() 
     indicator.frame = self.view.frame 
     indicator.activityIndicatorViewStyle = .whiteLarge 
     indicator.color = UIColor.blue 
     indicator.hidesWhenStopped = true 
     indicator.startAnimating() 
     self.view.addSubview(indicator) 
     self.view.layoutSubviews() 
     print("laid out subviews") 
    } 
} 

두 개의 인쇄 문을 실행하고, 디버거는 표시등이 하위 뷰를 같이 기본보기에 추가 된 것을 알 수 , 그러나 그것은 화면에 나타나지 않습니다. 내가 놓친 게 있니?

표시기의 위치는 viewDidLoad에서 동일한 코드를 올바르게 실행하면 화면 중간에 표시되므로 문제가되지 않습니다.

UPDATE는

나는 대리자를 사용하여 SEGUE 기능을 다시 한 그것은 정확하게 모든 것을 절약,하지만 문제는 남아있다. 여전히 활동 표시기가 없습니다.

@IBAction func saveRecord(_ sender: Any) { 
    print("indicator") 
    let indicator = UIActivityIndicatorView() 
    indicator.frame = self.view.frame 
    indicator.activityIndicatorViewStyle = .whiteLarge 
    indicator.color = UIColor.blue 
    indicator.hidesWhenStopped = true 
    indicator.startAnimating() 
    self.view.addSubview(indicator) 
    self.view.layoutSubviews() 
    print("laid out subviews") 
    saveImages() 
    print("saved images") 
    self.delegate?.saveRecord(name: name!, category: category) 
    print("saved record") 
    self.navigationController?.popViewController(animated: true) 
} 

업데이트 2

는 지금 정말 혼란 스러워요! 이 표시기 시작합니다

@IBAction func saveRecord(_ sender: Any) { 
    print("indicator") 
    indicator.startAnimating() 
    //saveImages() 
    //print("images saved") 
    //performSegue(withIdentifier: "saveRecord", sender: self) 
} 

을하지만이되지 않습니다 :

@IBAction func saveRecord(_ sender: Any) { 
    print("indicator") 
    indicator.startAnimating() 
    saveImages() 
    print("images saved") 
    performSegue(withIdentifier: "saveRecord", sender: self) 
} 
+0

코드에서 performSegue를 호출 했습니까? –

+0

감사합니다. 예 나는 segue를 유발하는 다양한 방법을 시도했지만 여전히 같은 문제가 있습니다. – Chris

답변

0

나는 당신이 언 와인드 SEGUE 대신 popViewController를 사용한다고 생각합니다. 그런 다음 뒤로 버튼의 사용자 정의 기능으로 더 많은 제어 기능을 사용할 수 있습니다.

당신이 다음 할 수있는 것은 : 뒤로 버튼을 클릭 (또는 이미지 저장 버튼을) 때

  • 다음 이미지 이미지 제거를 저장
  • 을 저장하면 표시를 추가 표시등
  • 당신은 prepare(for:)에 뷰를 업데이트 할 수 없습니다
+0

감사. 아직 대상보기 컨트롤러에서 작업해야하므로이 작업이 저에게 효과적이라고 생각하지 않습니다. – Chris

+0

그런 다음 위임 패턴을 사용하십시오.그리고 Paulw11의 대답은 제가 제안한 것과 거의 같습니다.) – Retterdesdialogs

+0

다시 한번 감사드립니다. 대리자 패턴의 크래시 과정 (이전에는 사용하지 못했던) 이후, 나는 그것을 재 작성했지만 여전히 동일한 문제를 겪고 있습니다. 업데이트 된 질문을 참조하십시오. – Chris

0

뷰 컨트롤러를 팝업; segue는 이미 진행 중입니다.

UI 요소에서 직접 unwind segue를 트리거하는 대신 활동 표시기를 표시하고 저장을 수행 한 다음 performSegue(withIdentifier:"yourUnwindSegueIdentifier", sender:self)을 호출하여 실제로 unwind를 수행하십시오.

+0

감사합니다. 어디에서 왔는지 알 겠지만 목적지보기 컨트롤러에서 세분화 된 작업을 수행하려면 어떻게해야합니까? 필자는 문서 https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html에서 "당신은 unwind action을 사용하여 unwind segue가 끝나기 전에 현재 view controller를 업데이트 할 수 있다고 말합니다. " – Chris

+0

여전히 긴장을 풀 수 있습니다. 보기 컨트롤러 아이콘에서 종료 아이콘까지 Ctrl 키를 누른 상태에서 unwind 메소드를 선택하고 결과 segue에 식별자를 부여하여 performSegue를 호출 할 수 있도록하십시오. – Paulw11

+0

감사 폴. 다시 말하지만,이 접근법을 사용하여 모든 저장 코드를 작동시킬 수는 있지만 표시기는 여전히 표시되지 않습니다. – Chris

0

문제는 saveRecord 함수가 완료 될 때까지 UI가 업데이트되지 않지만 Segue가 호출되어보기 컨트롤러가 즉시 닫히는 문제입니다. 나는 오늘 배운 또 다른 새로운 기술 인 디스패치 큐를 사용하여 그것을 해결했다. :

@IBAction func saveRecord(_ sender: Any) { 
    indicator.startAnimating() 
    DispatchQueue.global(qos: .userInitiated).async { 
     self.saveImages() 
     DispatchQueue.main.async { 
      self.performSegue(withIdentifier: "saveRecord", sender: self) 
     } 
    } 
} 
관련 문제