2017-02-28 8 views
2

특정 조건에 따라 다른 결과를 표시하는 선택 도구를 설정하려고합니다. 유일한 문제는 dataSource (표시 할 피커 데이터)을 viewDidLoad 외부에 넣어야한다는 것입니다. 조건이 충족되면 적절한 데이터를로드하려면 viewDidLoad이 필요합니다. 그러나 내가 본 피커를 다루는 코드에서는 dataSource 배열이 viewDidLoad 외부에 배치 된 것 같습니다 (대리자 메서드가이 값을 사용할 수 있도록 가정합니다). 나는 이것을 dataSourceviewDidLoad에 두어 인식 할 수 있는지 또는 viewDidLoad 외부의 스위치 나 If 문을 실행할 수있는 방법이 있는지 궁금하다.Xcode Swift 3 Picker : ViewDidLoad에 데이터 소스 넣기

import UIKit 
import Parse 

class VC: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    var pickerData = [String]() 

    @IBOutlet weak var namePicker: UIPickerView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     namePicker.dataSource = self 
     namePicker.delegate = self 


     //here I want the picker to show something different depending on the value of nameOfPerson. I changed the order of the array because the picker selects the first name of the array as the default. 
     switch nameOfPerson 
     { 
     case "Carly": 
      let pickerData = ["Carly","Jeff","Bob","Anita"] 
     case "Jeff": 
      let pickerData = ["Jeff","Carly","Bob","Anita"] 
     case "Bob": 
      let pickerData = ["Bob","Carly","Jeff","Anita"] 
     case "Anita": 
      let pickerData = ["Anita","Carly","Jeff","Bob"] 
     } 
    } 
    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
    return 1 
    } 
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return pickerData.count 
    } 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return pickerData[row] 
    } 
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 

    } 
} 
+1

질문에 코드를 추가 할 수 있습니까? 나는 몇 번 읽었고, 나는 아직도 당신이 묻는 것에 대해 혼란스러워합니다. –

답변

2
그것을 인식 할 수 있도록 내가있는 viewDidLoad에이 데이터 소스를 배치 할 수 있다면 난 그냥 궁금

, 또는 스위치 또는 경우를 실행하는 방법이 된 경우 viewDidLoad에 외부 클래스의 문

아니요. 데이터 소스 메서드는 이어야합니다. 즉 Objective-C가 클래스의 최상위 수준에서 함수를 참조해야합니다. 따라서 데이터 자체는 데이터 소스 메서드에서 볼 수 있어야하며 viewDidLoad과 데이터 소스 메서드간에 데이터를 공유하는 일관된 유일한 방법은 var pickerData과 같은 속성입니다. 당신의 코드를 잘못 무엇

let입니다 :

case "Carly": 
     let pickerData = ["Carly","Jeff","Bob","Anita"] 
    case "Jeff": 
     let pickerData = ["Jeff","Carly","Bob","Anita"] 
    case "Bob": 
     let pickerData = ["Bob","Carly","Jeff","Anita"] 
    case "Anita": 
     let pickerData = ["Anita","Carly","Jeff","Bob"] 
    } 

그 각각의 경우에서 용어 let 삭제! 그렇지 않으면 당신이하고 싶은 일이 아닌 임시 로컬 변수 pickerData을 설정하는 것입니다. 당신은 당신이 다음과 같이 선언 특성 설정하려면 :

var pickerData = [String]() 

....와 코드가 그 일을하지 않습니다! 당신이 원하는 것은 이것이다 : (. 게다가 당신은 물론, default 경우 필요)

case "Carly": 
    self.pickerData = ["Carly","Jeff","Bob","Anita"] 
case "Jeff": 
    self.pickerData = ["Jeff","Carly","Bob","Anita"] 
case "Bob": 
    self.pickerData = ["Bob","Carly","Jeff","Anita"] 
case "Anita": 
    self.pickerData = ["Anita","Carly","Jeff","Bob"] 
} 

그런 다음

, 말, 그냥 안전한 편에 데이터를 다시로드 :

self.namePicker.reloadAllComponents() 
+0

아름다운. 도와 주셔서 감사합니다! – Kevin

+1

도와 드리겠습니다. 이 질문에 질문에 코드를 포함하는 것이 얼마나 중요한지 주목하십시오.일반은 무의미합니다. 우리가 실제 문제를 볼 수 없으면 도움이 불가능합니다! – matt

0

보기가로드되는 동안 데이터 소스를 설정해야하지만 어디서든 필요할 때로드 할 수 있습니다.

어느 곳 viewDidLoad

picker.datasource = self 

내부, 당신은 실제 데이터를 설정할 수 있습니다;

picker.dataArray = "example, anything" 

잘 모르겠습니다. 당신이 이것을 찾고 있지 않다면 알려주십시오.