繁体   English   中英

UIPickerView委托未在子视图中调用

[英]UIPickerView delegate not called in a subview

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

在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作为文本字段的输入。

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不会显示数据。 实际上,由于从未调用“打印”,因此未调用委托和数据源。 但是,相同的代码在简单的UIView应用程序中也可以正常工作。 我找不到与此问题相关的任何解决方案。

UIPickerView不显示数据

问题出在您的ViewController类的viewDidLoad上。

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

ViewController viewDidLoad更新为以下内容:

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)
}

这是因为您没有加载选择器

您应该参考SearchViewController而不是其View

ViewController:

class ViewController: UIViewController {

    @IBOutlet weak var segment: UISegmentedControl!
    @IBOutlet weak var viewContainer: UIView!
    var searchController: SearchViewController!
    var favController: FavoriteViewController!

    override func viewDidLoad() {
        super.viewDidLoad()
        searchController = SearchViewController()
        favController = FavoriteViewController()
        viewContainer.addSubview(searchController.view)
        viewContainer.addSubview(favController.view)
        searchController.loadPickerView()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    @IBAction func segmentChange(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex{
        case 0:
            viewContainer.bringSubview(toFront: searchController.view)
             searchController.loadPickerView()
            break
        case 1:
            viewContainer.bringSubview(toFront: favController.view)
            break
        default:
            break
        }
    }
}

将loadPickerView func添加到SearchViewController

 func loadPickerView() {
        cgpicker.delegate = self
        cgpicker.dataSource = self
        self.textFieldUserName.inputView = cgpicker
        textFieldUserName.text = categories[0]
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM