首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >未在子视图中调用UIPickerView委托

未在子视图中调用UIPickerView委托
EN

Stack Overflow用户
提问于 2018-06-03 06:11:05
回答 1查看 523关注 0票数 -1

我有一个使用UISegmentedControl在两个选项卡之间切换的简单iOS应用程序。

在ViewController.swift中:

代码语言:javascript
复制
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作为文本字段的输入。

代码语言:javascript
复制
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()
}

}

但是,当我单击文本字段时,PickerView不显示数据。实际上,委托和数据源并没有被调用,因为"print“从来没有被调用过。然而,相同的代码在一个简单的UIView应用程序中工作得很好。我找不到任何与此问题相关的解决方案。

UIPickerView not showing data

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 06:40:40

问题出在ViewController类的viewDidLoad上。

您没有正确创建容器视图控制器。阻止选取器工作的主要问题是,当viewDidLoad完成时,您的SearchViewController没有对它的强引用,因此SearchViewController中的选取器变成了nil

ViewController viewDidLoad更新为如下所示:

代码语言:javascript
复制
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)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50661575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档