UIPickerView 委托未在子视图中调用 [英] UIPickerView delegate not called in a subview
问题描述
我有一个简单的 iOS 应用程序,它使用 UISegmentedControl 在两个选项卡之间切换.
I have a simple iOS app that uses UISegmentedControl to switch between two tabs.
在 ViewController.swift 中:
In ViewController.swift:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var segment: UISegmentedControl!
@IBOutlet weak var viewContainer: UIView!
var searchView: UIView!
var favView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
searchView = SearchViewController().view
favView = FavoriteViewController().view
viewContainer.addSubview(favView)
viewContainer.addSubview(searchView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func segmentChange(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex{
case 0:
viewContainer.bringSubview(toFront: searchView)
break
case 1:
viewContainer.bringSubview(toFront: favView)
break
default:
break
}
}
}
在第一个选项卡中,我有一个 UIPickerView 作为文本字段的输入.
And in the first tab, I have a UIPickerView as input of a Textfield.
import UIKit
class SearchViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var keywordField: UITextField!
@IBOutlet weak var categoryField: UITextField!
@IBOutlet weak var distanceField: UITextField!
@IBOutlet weak var locationField: UITextField!
var cgpicker = UIPickerView()
let categories = ["Default", "Airport", "Amusement Park", "Aquarium", "Art Gallery", "Bakery", "Bar"]
override func viewDidLoad() {
super.viewDidLoad()
cgpicker.delegate = self
cgpicker.dataSource = self
categoryField.inputView = cgpicker
categoryField.text = categories[0]
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
print("picker working")
return categories.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return categories[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
categoryField.text = categories[row]
categoryField.resignFirstResponder()
}
}
但是,当我单击 Textfield 时,PickerView 不显示数据.事实上,没有调用委托和数据源,因为从未调用过打印".然而,相同的代码在一个简单的 UIView 应用程序中运行良好.我找不到与此问题相关的任何解决方案.
However, when I click the Textfield, the PickerView doesn't display data. In fact the delegate and datasource is not called since the "print" is never called. However the same code is working fine in a simple UIView app. I cannot find any solution related to this problem.
推荐答案
问题在于 ViewController
类的 viewDidLoad
.
您没有正确创建容器视图控制器.阻止选择器工作的主要问题是,当 viewDidLoad
完成时,您的 SearchViewController
没有强引用它,因此 SearchViewController
中的选择器变为 无
.
You are not creating the container view controller properly. The primary issue preventing the picker from working is that your SearchViewController
has no strong reference to it when viewDidLoad
finishes so the picker in SearchViewController
becomes nil
.
将 ViewController viewDidLoad
更新为如下所示:
Update the ViewController viewDidLoad
to something like this:
override func viewDidLoad() {
super.viewDidLoad()
let searchVC = SearchViewController()
searchView = searchVC.view
addChildViewController(searchVC)
// Should set searchView frame or constraints
viewContainer.addSubview(searchView)
searchVC.didMove(toParentViewController: self)
let favVC = FavoriteViewController()
favView = favVC.view
addChildViewController(favVC)
// Should set favView frame or constraints
viewContainer.addSubview(favView)
favVC.didMove(toParentViewController: self)
}
这篇关于UIPickerView 委托未在子视图中调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!