2017-10-26 2 views
0

I 3 개 viewControllers을 가지고 있고 (이 제 VC 임)패스 데이터

var steppers : UIStepper? 

    @IBOutlet weak var hourLabel: UILabel! 
    @IBOutlet weak var stepper: UIStepper! 

    @IBAction func stepper(_ sender: UIStepper) { 

     hourLabel.text = String(sender.value) 
    } 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let nc = segue.destination as? SelectClass { 
      nc.limit = Int(stepper.value) 
     } } 

이 방식 제에 처음부터 데이터를 전달하고있어 두 번째 VC 내가 var limit = 0 있습니다. 여기까지 모든 것이 잘 작동하지만 내가하고 싶은 것은 사용자가 세 번째 VC에게 스테퍼에게주는 값을 전달하는 것입니다. 나는 세 번째 VC var limit2 = 0에 또 다른 변수를 생성하고, 세 번째

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let vc = segue.destination as? ThirdClass { 
      vc.limit2 = limit 
     } } 

에 있지만 결과없이 secondo VC에서이 방법으로 데이터를 전달하려고 내 var limit2 = 0 항상 값 대신 0의 값을 가지고있다 나는 스테퍼와 함께 추가했다. 어떻게해야합니까?

이이 두 번째 VC

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     if segue.identifier == nearbySearchSegueIdentifier { 
      guard let category = sender as? QCategoryy else { 
       return 
      } 
      if let selectedRows = tableView.indexPathsForSelectedRows { 

       if let vc = segue.destination as? ThirdClass { 
       vc.category = category 
       vc.limit2 = limit 
      } 
     } 
    } 
} 
+0

VC1에서 VC3으로 직접 가고 있습니까? – Malik

+0

두 번째와 세 번째 VC를 연결하는 segue를 추가하는 것을 잊었습니까? – Sweeper

+0

@Malik no 두 번째 VC를 통과해야합니다. – seran

답변

0

limit2는이 컨디셔닝 때문에 설정하지 않는 것이 그것의 가능한 현재의 코드을 고려 에 유효하지 않습니다 :

// This condition could be failing sometimes 
if let selectedRows = tableView.indexPathsForSelectedRows { 
    if let vc = segue.destination as? ThirdClass { 
     vc.category = category 
     vc.limit2 = limit 
    } 
} 

Documentation에 따르면, indexPathsForSelectedRows 옵션을 반환하고 그 값이 nil이 아닌 경우 SEGUE에, 당신은 단지 limit2를 설정한다. 당신이 shouldPerformSegue(withIdentifier:sender:)here을 확인하는 segue을하기 위해 조건을 충족해야하는 경우

시도는 조건 외부 limit2를 설정하기 때문에 항상 실행되고.

또한 VC3에 필요한 값이 VC1을 벗어날 때의 값과 같으면 VC2에 의존하지 않고도 VC3에서 데이터를 전달하는 데 사용할 수있는 여러 가지 방법이 있습니다.

하나는 VC1에서 정적 변수을 만들 로하고 VC2로 밀어 전에 제한 값을 설정할 수 있습니다 : 아마 (당신이 원하는 때마다 글로벌 값을로드 VC3 내부

var steppers : UIStepper? 

    @IBOutlet weak var hourLabel: UILabel! 
    @IBOutlet weak var stepper: UIStepper! 

    // ADD THIS 
    static var globalLimit: Int = 0 

    @IBAction func stepper(_ sender: UIStepper) { 
     hourLabel.text = String(sender.value) 
    } 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let nc = segue.destination as? SelectClass { 
      nc.limit = Int(stepper.value) 
      // AND THIS 
      VC1ClassName.globalLimit = Int(stepper.value) 
     } 
} 

그런 viewDidLoad을) :

override func viewDidLoad() { 
    super.viewDidLoad() 
    limit2 = VC1ClassName.globalLimit 
} 

ViewControllers를 통과하는 데이터를 갖는 대신 StepperManager 클래스 또는 데이터 관리를 담당하는 유사한 클래스를 만들고 언제든지 필요한 모든 클래스에서 액세스 할 수 있습니다.

+0

완벽! 이 작품은 위대한, 감사합니다 – seran

+0

당신은 오신 것을 환영합니다! – jvrmed

0

에 준비되어 왜 그냥 경우 첫 번째에서 두 번째 세 번째에 통과하지?

FirstVC :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "tosecondsegue" { 
      let itemController : Second = segue.destination as! Second 
      itemController.limit = 0 //Whatever you want 
    } 
} 

SecondVC :

var limit = 0 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "tothirdsegue" { 
      let itemController : ThirdVC = segue.destination as! ThirdVC 
      itemController.limit2 = limit 
     } 
} 

ThirdVC :

var limit2 = 0 

//Use it here now 
+0

"변수가 자체 초기 값 내에서 사용됨"항목 controller.limit에서이 오류가 발생 함 – seran

+0

무엇을 설정하고 있습니까? 'itemController.limit ='를? –

+0

itemController.limit = Int (stepper.value) – seran