0

viewController에는 입력이 여러 개 있습니다. 일부는 일반 텍스트이지만 일부는 선택기에서 입력해야합니다. 각각의 구현을 조금 더 깔끔하게 유지하기 위해 각각 PickerDelegatePickerDataSource을 별도의 파일로 이동하기로 결정했습니다. 데이터가 나타나지만 Picker를 선택하면 viewController에서 이벤트를 발생시키는 방법을 알 수 없습니다. 현재 PickerDelete 클래스에서만 발생합니다.프로그래밍 방식으로 만들 때 UIPickerDelegate에서 선택한 값을 반환하는 방법

몇 가지 기본 레이아웃 정보 내가

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    myClassSource = MyClass() 
    pickerView = UIPickerView() 
    pickerView.dataSource = myClassSource 
    pickerView.delegate = myClassSource 

    // set the input view of the job type to be a picker view 
    textInput.inputView = pickerView 
    textInput.text = jobTypePickerValues[0] 
} 
+0

당신은 .. 문제는이 내 질문에 대답 문제를 –

답변

0

당신은 하나의 사용자 정의 대리자를 만들고 ViewController에서 구현해야 다음 한 선택기를 보여주는 내보기 컨트롤러에서

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

let jobTypePickerValues = ["value1", "value2"] 

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

// returns the # of rows in each component.. 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return jobTypePickerValues.count 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return jobTypePickerValues[row] 
} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    //println("I want this in the view controller that set up the picker") 
} 

은 어디 pickerView를 만들고 있습니다.

protocol CustomPickerDelegate { 
    func selectedItem(item: String) 
} 

지금 MyClass 내부에이 프로토콜의 인스턴스를 생성하고 지금 viewDidLoad의 대리자를 설정 한`ViewController``

class MyClass: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 

    let jobTypePickerValues = ["value1", "value2"] 
    var delegate: CustomPickerDelegate? 
    .. Other code and methods 

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     delegate?. selectedItem(jobTypePickerValues[row]) 
    } 
} 

내부 구현 및 프로토콜의 방법을 구현한다.

class ViewController: UIViewController, CustomPickerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     myClassSource = MyClass() 
     myClassSource.delegate = self 
     pickerView = UIPickerView() 
     pickerView.dataSource = myClassSource 
     pickerView.delegate = myClassSource 

     // set the input view of the job type to be a picker view 
     textInput.inputView = pickerView 
     textInput.text = jobTypePickerValues[0] 
    } 

     func selectedItem(item: String) { 

      textInput.text = item 
     } 
} 
+0

감사를 해결할하지만 난 내가했던 MyClass의 클래스에서 그를 추가 할 필요가 있다고 생각보기 컨트롤러 클래스에서 호출 할 수 있습니다 MyClass의 사용자 정의 대리자를 만들 수 있습니다 change 이벤트에 대한 리스너를 추가 한 다음 위와 같은 대리 메서드를 호출합니다. 'func pickerView (pickerView : UIPickerView, didSelectRow 행 : Int, inComponent 구성 요소 : Int) { delegate? selectedItem ("이것은 ViewController로 전송됩니다.) } ' – Matt

+0

@Matt 예 해당 코드를 추가하는 것을 잊었습니다.'대리자? selectedItem ("이 ViewController 보내고있다")' –

+0

하지만 그때 다른 문제는 없습니다. –