2017-01-12 4 views
0

this 질문에 대한 답변을 듣고 있지만 ViewControllerB (두 번째 View Controller)의 데이터를 ViewController (초기 View Controller)으로 전달하는 데 문제가 있습니다. 내가 추가 한 몇 개의 인쇄문의 결과를 바탕으로, 에 풀리는 것이 textFieldDidEndEditing 전에 일어나고 있다고 생각합니다. 긴급한 상태에서 텍스트 필드의 데이터 전달 문제

dataPassed from ViewControllerB: Default passed data 
newValue: Default passed data 
textFieldDidEndEditing: Pass this back 

는 I 성공적 수 있었다 ViewControllerB의 버튼에 출구를 만들고 dataPassed = textField.text 설정하여 ViewController에 다시 데이터를 전달한다. 이 작업을 수행 할 수 있었던 또 다른 방법은 unwindToThisController 함수에서 dataReceived = sourceViewController.dataPasseddataReceived = sourceViewController.textField.text으로 변경하는 것입니다. 그러나 위에서 언급 한 허용 된 응답의 포스터가 이러한 해결 방법 중 하나를 사용하는 것처럼 보이지는 않으며 이러한 해결 방법 중 하나가이를 수행 할 수있는 적합한 방법인지 확실하지 않습니다. 내가 엑스 코드 8.2.1 및 스위프트를 사용하고

3.

의 ViewController 코드 (초기보기 컨트롤러)

/* ViewController.swift */ 
import UIKit 

class ViewController: UIViewController { 

    var dataReceived: String? { 
    willSet { 
     print("newValue: " + newValue!) 
     labelOne.text = newValue 
    } 
    } 

    @IBOutlet weak var labelOne: UILabel! 

    @IBAction func buttonOne(_ sender: UIButton) { 
    performSegue(withIdentifier: "viewNext", sender: self) 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    labelOne.text = "Default passed data" 
    } 

    // Segue ViewController -> ViewControllerB 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "viewNext" { 
     let viewControllerB = segue.destination as! ViewControllerB 
     viewControllerB.dataPassed = labelOne.text 
    } 
    } 

    // Segue ViewController <- ViewControllerB 
    @IBAction func unwindToThisControllerWithSegue(sender: UIStoryboardSegue) { 
    if let sourceViewController = sender.source as? ViewControllerB { 
     print("dataPassed from ViewControllerB: " + sourceViewController.dataPassed!) 
     dataReceived = sourceViewController.dataPassed 
     //dataReceived = sourceViewController.textField.text 
    } 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

} 

ViewControllerB 코드 (두 번째보기 컨트롤러)

/* ViewControllerB.swift */ 
import UIKit 

class ViewControllerB: UIViewController, UITextFieldDelegate { 

    var dataPassed: String? 

    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    textField.text = dataPassed 
    textField.delegate = self 
    } 

    // Text field delegate methods 
    func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    textField.resignFirstResponder() 
    return true 
    } 

    func textFieldDidEndEditing(_ textField: UITextField) { 
    print("textFieldDidEndEditing: " + textField.text!) 
    dataPassed = textField.text 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    } 

} 
+0

'print ("ViewControllerB에서 데이터 패스 :"+ sourceViewController.dataPassed! ")에 중단 점을 넣으면 어떻게됩니까? 당신은'sourceViewController'를 검사하고 어느 속성이 정의되고 있는지 확인할 수 있습니까? – brandonscript

+0

당신이 옳다고 생각하는 것처럼,'textFieldDidEndEditing'가 호출되기 전에 View Controller를 닫는 IBAction 이벤트가 발생하고 있습니다. 사물의 순서를 바꾸고 첫 번째 응답자를 사퇴시키는 버튼을 처리하고,보기 컨트롤러를 닫는 다른 버튼이나 기능을 사용할 수 있습니다. – brandonscript

+0

@mosley -'unwindToThisControllerWithSegue' 안에'dataPassed = sourceViewController.textField.text'라고 말 했나요? 'UITextField' 델리게이트가'textFieldDidEndEditing (_ :)'을 호출하기를 기다리는 대신 현재 textField에있는 텍스트를 취할 수 있습니다. 그냥 생각 했어요 – Pierce

답변

0

나는 오전 그 질문의 질문자와 다행히도 나는 그 샘플 프로젝트의 백업을 가지고 여기에 내가 무엇을 발견했다. 이것은 첫 번째보기 컨트롤러에서 내가 한 것입니다.

var displayValue: Double{ 
    get{ 
     return NSNumberFormatter().numberFromString(display.text!)!.doubleValue 
    } 
    set{ 
     display.text?="\(newValue)" 
     typing=false 
    } 
} 
@IBAction func unwind(segue: UIStoryboardSegue){ 
    let foo = segue.sourceViewController as! viewControllerB 
    let a = foo.dataSent 
    displayValue = NSNumberFormatter().numberFromString(a!)!.doubleValue 
} 

괜찮 았습니다. 어쩌면 작업중인 샘플 프로젝트를 공유 할 수 있다면 왜 작동하지 않는지 알 수 있습니다. :)

+0

공유 방법을 잘 모르겠습니다. 전체 프로젝트. – mosley

+0

@mosley Github, dropbox, 등등. 또한 하나의 질문은, 'TextFieldDidEndEditing' ViewControllerB에서 오는 중단 점입니까? – ebby94