2017-02-22 5 views
0

У меня есть UIPickerView, что я подклассифицирую, что отлично работает. Однако у меня есть метод, который мне нужно вызвать, чтобы «перезагрузить» UIPicker из UIViewController, в котором он просматривается. Однако он никогда не срабатывает. Как мне позвонить func resetPicker() с другого контроллера?Как вызвать метод в подклассе UIPickerView с другого контроллера?

import Foundation 
import UIKit 

class ScoreClockPicker: UIPickerView { 

    //PickerView 
    let timerMinutesArray = Array(00...20) 
    let timerSecondsArray = Array(00...59) 
    let periodArray = ["1st", "2nd", "3rd", "OT", "SO"] 

    //Picker return values 
    var numberOfRowsInComponentReturnValue = 0 
    var titleForRowReturnValue    = "" 
    var widthForComponentReturnValue  = "" 


    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     self.delegate = self 
     self.dataSource = self 

    } 

    func resetPicker() { 
     print("resetPicker") 

     self.selectRow(0, inComponent: 0, animated: true) 
     self.selectRow(0, inComponent: 1, animated: true) 
     self.selectRow(0, inComponent: 3, animated: true) 

    } 
} 

extension ScoreClockPicker: UIPickerViewDataSource { 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

     if component == 0 { 

      numberOfRowsInComponentReturnValue = periodArray.count 

     } else if component == 1 { 

      numberOfRowsInComponentReturnValue = timerMinutesArray.count 

     } else if component == 2 { 

      numberOfRowsInComponentReturnValue = 1 

     } else if component == 3 { 

      numberOfRowsInComponentReturnValue = timerSecondsArray.count 

     } 

     return numberOfRowsInComponentReturnValue 

    } 

    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 4 

    } 

    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat { 
     var componentWidth = 0 

     if component == 0 { 

      componentWidth = 140 

     } else if component == 1 { 

      componentWidth = 40 

     } else if component == 2 { 

      componentWidth = 30 

     } else if component == 3 { 

      componentWidth = 40 
     } 

     return CGFloat(componentWidth) 
    } 


} 

extension ScoreClockPicker: UIPickerViewDelegate { 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 

     print("didSelectRow") 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

     if component == 0 { 

      titleForRowReturnValue = periodArray[row] 

     } else if component == 1 { 

      titleForRowReturnValue = String(describing: timerMinutesArray[row]) 

     } else if component == 2 { 

      titleForRowReturnValue = ":" 

     } else if component == 3 { 

      titleForRowReturnValue = String(format: "%02d",timerSecondsArray[row]) 
     } 

     return titleForRowReturnValue 

    } 

} 

EDIT:

Следующая не работает с ViewController вызова ScoreClockPicker:

import UIKit 

class ScoreClockViewController: UIViewController { 

    @IBOutlet weak var resetButton: UIButton! 
    @IBOutlet weak var okButton: UIButton! 

    var picker: ScoreClockPicker? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

    } 

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

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     //Hide the Navigation Bar 
     self.navigationController?.setNavigationBarHidden(false, animated: true) 
    } 

    //@IBOutlet 
    @IBAction func reset(_ sender: Any) { 
     print("reset") 

     picker?.resetPicker() //Call the ScoreClockPicker 

//  picker?.selectRow(0, inComponent: 0, animated: true) 
//  picker?.selectRow(0, inComponent: 1, animated: true) 
//  picker?.selectRow(0, inComponent: 3, animated: true) 
    } 

    @IBAction func ok(_ sender: Any) { 
    } 


} 
+0

Добавьте код, в котором вы создаете объект 'ScoreClockPicker'. Средство добавляет код вашего ViewController. –

+0

@NiravD, см. Править выше. Я пробовал это, и он не работает. –

+0

Где вы инициализировали этот объект 'picker', покажите нам код этого тоже. Также сброс - действие кнопки? –

ответ

1

из кода вы не инициализирован picker объект, который вы пытаетесь использовать в действие кнопки. Так просто инициализируйте picker перед его использованием.

Если вы делаете выход из ScoreClockPicker затем

@IBOutlet var picker: ScoreClockPicker! 

ИЛИ вы можете инициализировать picker в viewDidLoad

self.picker = ScoreClockPicker() 
+0

@PaulS. Добро пожаловать! –

Смежные вопросы