PickerView 加载表格视图数据 Swift

Posted

技术标签:

【中文标题】PickerView 加载表格视图数据 Swift【英文标题】:PickerView load up tableview data Swift 【发布时间】:2015-03-10 14:24:27 【问题描述】:

目前,我的 uipicker 有 3 个选项,Cameron、Shaffer 和 Hydril。当我选择 Cameron 时,我希望我的 uitableview 加载 camerondata1。如果我选择 Shaffer,我希望它加载 camerondata2。

如何设置我的 UItableview 以根据我的选择器视图上所做的选择重新调整?我是 Swift 编程新手。

class Picker2: UIViewController, UIPickerViewDelegate, UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate

    
        var activeTextField:UITextField?
        let textCellIdentifier = "TextCell"
        let camerondata1 = ["Working Pressure (psi): 5,000", "Fluid to Close (gal):  1.69",]

        let camerondata2 = ["Working Pressure (psi): 10,000", "Fluid to Close (gal):  2.69",]

        @IBOutlet var pickerView1: UIPickerView!

        @IBOutlet var textField1: UITextField!

        var brand = ["Cameron","Shaffer", "Hydril"]

        override func viewDidLoad() 

            super.viewDidLoad()
            pickerView1 = UIPickerView()
            pickerView1.tag = 0
            pickerView1.delegate = self
            self.view.addSubview(textField1)
        

        func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int  
            return 1
        

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

            if pickerView.tag == 0 

                return brand.count
            

            return 1
        

        func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 

            if pickerView.tag == 0 

                return brand[row]
            
            return ""
        
        func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  

            if pickerView.tag == 0 

                textField1.text = brand[row]
            
        
        func numberOfSectionsInTableView(tableView: UITableView) -> Int 
            return 1
        
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

            return camerondata1.count
        

        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

            let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) as UITableViewCell

            let row = indexPath.row

            cell.textLabel?.text = camerondata2[row]

            return cell
        
        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

            tableView.deselectRowAtIndexPath(indexPath, animated: true)
            let row = indexPath.row
            println(camerondata1[row])
        
    

【问题讨论】:

【参考方案1】:

我假设您在与您的 pickerView 相同的视图中有一个 tableView(如果您这样做,您需要为您的 table view 创建一个插座并将其连接到委托和数据源)。我的回答是基于这个假设。

基本上,只需在您的cellForRowAtIndexPath: 方法中添加一个条件语句。您可以这样做的一种方法是声明一个变量来保存当前选择的任何选择器值:

var pickerIdentifier: String?

然后,在您的 pickerView(_: didSelectRow:) 方法中,将 pickerIdentifier 设置为选择的值。

最后,在dequeueReusableCellWithIdentifier 方法中编写一个条件,根据pickerIdentifier 的值使用正确的camerondata 数组值填充单元格。

如果将来cameronadata1camerondata2 中的值数量不匹配,您需要在numberofRowsInSection: 方法上设置另一个条件。

总是想你想做什么,然后把它分解。如果要根据其他内容更改表格行单元格的文本值,则需要转到创建(或出列)表格视图单元格的位置。此外,如果它依赖其他东西,那么使用条件。如果您的表格视图单元格没有显示任何内容,则说明您没有正确连接表格视图。

class ViewController: UIViewController, UIPickerViewDelegate, UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate 
var pickerIdentifier: String?
let textCellIdentifier = "TextCell"
let camerondata1 = ["Working Pressure (psi): 5,000", "Fluid to Close (gal):  1.69",]
let camerondata2 = ["Working Pressure (psi): 10,000", "Fluid to Close (gal):  2.69",]

@IBOutlet var pickerView1: UIPickerView!
@IBOutlet weak var tableView: UITableView!

var brand = ["Cameron","Shaffer", "Hydril"]

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return brand.count


func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
        return brand[row]


func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  
        pickerIdentifier = brand[row]
        tableView.reloadData()


func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int  
    return 1


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return pickerIdentifier == "Cameron" ? camerondata1.count : camerondata2.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) as UITableViewCell

    if pickerIdentifier == "Cameron" 
        cell.textLabel!.text = camerondata1[indexPath.row]
     else 
        cell.textLabel!.text = camerondata2[indexPath.row]
    
    return cell


【讨论】:

你把interface builder中的tableView连接到view controller的数据源和delegate了吗? 是的,tableview 连接到数据源和委托。我收到一个 '(UITableView, numberOfRowsInSection: Int) -> Int' does not have a member named 'reloadData' 错误。在 tableView.reloadData()。 很抱歉……你是对的。我确实忘记连接 uitableview。

以上是关于PickerView 加载表格视图数据 Swift的主要内容,如果未能解决你的问题,请参考以下文章

重新加载除一个单元格之外的表格视图

使用 Swift 在表格视图中重新加载单元格数据

Swift 5:给定的数据不是有效的JSON(将数据从API加载到表格视图)

Firebase - iOS Swift:使用从两个单独的子节点检索到的数据加载表格视图单元格

如何在swift 3分页期间在表格视图中显示所有数据?

Swift:多次加载表格时崩溃