2014-10-12 3 views
2

나는 여러 가지 통화로 Bitcoin의 가격을 사람들에게 알려주는 Swift에서 앱을 개발 중입니다. 통화를 선택하려면 사용자가 UITableView가있는보기 컨트롤러의 목록에서 선택합니다. 이것은 currencyViewController이며, 그것은 내 메인 화면 인 viewController에서 제공됩니다.다른보기 컨트롤러에서 하나의 변수 수정 swift

내가 원하는 것은 사용자가 currencyViewController를 닫을 때 주 viewController의 UIButton에 문자열을 전달한다는 것입니다.

여기서 데이터 전달한다 prepareForSegue 함수이다 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "presentCurrency") { 

     currencySelector.setTitle("\currencySelected", forState: UIControlState.Normal) 

    } 
} 

CurrencySelector 주의 ViewController에있는 UIButton이다 및 currencySelected 번째 뷰 컨트롤러 currencyViewController의 변수이다. "볼 수없는

  1. 의 ViewController에서 변수 :

    그것은"리터럴에 잘못된 이스케이프 시퀀스 "그래서

    오류를 제공, 나는 두 가지 문제 중 하나로 좁혀했습니다 "from currencyViewController. 그렇다면 어떻게 CurrencyViewController에서 CurrencySelector의 텍스트를 수정할 수 있습니까?

  2. 사용자가 밀어 넣기 한 CurrencyViewControler를 종료하면 prepareForSegue가 호출되지 않습니다.

여기에 무슨 일이 일어나고 있습니까? 고마움과 사과 - 저는 신속한 초보자입니다. 당신은 문자열의 변수를 평가 후면 위해 괄호를 사용할 필요가

+1

I 첫 컨트롤러로 돌아 가면 prepareForSegue가 호출되기를 원할 때, 당신은 긴장을 풀고 다시 돌아 가야한다. – rdelmar

답변

14

2 - "prepareForSegue은"당신이 SEGUE를 통해 새로운 뷰 컨트롤러를 누르면라고,하지만 당신은 그것을 해고하지 않을 때입니다. 해고 당하면 아무도 불리지 않는다.

1 - 이렇게하는 좋은 방법은 위임자 패턴입니다.

따라서 주보기 컨트롤러는 currencyViewController의 대리자가되며 해당 컨트롤러가 닫힐 때 메시지를 받게됩니다. currencyViewController 파일의 시작에서

당신이 위임 준비 :

protocol CurrencyViewControllerDelegate { 
    func currencyViewControllerDidSelect(value: String) 
} 

을하고 currencyViewController에 변수를 추가 : 이제

var delegate : CurrencyViewControllerDelegate? 

의 mainViewController가 준수해야 그 프로토콜과 그 기능에 대한 대답 :

class MainViewController : UIViewController, CurrencyViewControllerDelegate { 
    //... 

    func currencyViewControllerDidSelect(value: String) { 
    //do your stuff here 
    } 
} 

모든 것이 준비되었습니다.마지막 단계는, prepareForSegue (MainViewController)에, 당신은 currencyViewController의 위임 설정합니다 :

var currencyVC = segue.destinationViewController as CurrencyViewController 
currencyVC.delegate = self; 

을 그리고 사용자가 currencyViewController의 값을 선택하면, 바로 위임에 그 함수를 호출 :

self.delegate?.currencyViewControllerDidSelect("stuff") 

약간 복잡한 어쩌면,하지만 매우 유용한 패턴은 여기에 :)입니다 당신이 원하는 경우 더 많은 정보와 좋은 튜토리얼이 :

http://www.raywenderlich.com/75289/swift-tutorial-part-3-tuples-protocols-delegates-table-views

+0

패턴에 다소 복잡 할 수 있지만 분명히 멋지 며 iOS 개발의 일부 기능을 보여줍니다. – David

4

, 즉 두 번째 뷰 컨트롤러 당신이에 대한 참조를 가져해야합니다 (SEGUE의 목적지 인 하나)의 변수에 액세스하려면 println("\(currencySelected)")

:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "presentCurrency") { 
     let currencyViewController = segue.destinationViewController as CurrencyViewController // the name or your class here 

     currencySelector.setTitle("\(currencyViewController.currencySelected)", forState: UIControlState.Normal) 

    } 
}