gpt4 book ai didi

ios - Swift 字典 UIPickerView (键)和 UITableView (值)

转载 作者:行者123 更新时间:2023-11-30 11:52:29 26 4
gpt4 key购买 nike

Img: Now the app: data does not change

Img: Now the app: data does not change

我目前正在使用 Swift 开发一个应用程序,其中使用 UIPickerView 和 TableView(这适用于单个 View )。我想更改 pickerView (myPickerView) 中的键,更改将 TableView(myTableView) 中的值更改为正确的数据(自动)。

import UIKit

struct Cars {

var carName: String!
var carModel: [String]!

}

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITableViewDataSource, UITableViewDelegate {

// Dictionary
var myDictionary = [
"BMW": ["M3", "M4", "M5"],
"Porsche": ["Panamera", "911", "Cayenne"],
"Audi": ["RS4", "RS6", "RS5"],
"Mercedes": ["Class S", "SL", "AMG GTR"]
]

// Array
var allObjects = [Cars]()

override func viewDidLoad() {
super.viewDidLoad()

view.backgroundColor = .white

// Func - Constraint PickerView/TableView/Button
setupUI()

// PickerView Delegate/DataSource
myPickerView.dataSource = self
myPickerView.delegate = self

// TableView Delegate/DataSource
myTableView.delegate = self
myTableView.dataSource = self

myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellId")

// Loop key and value - myDictionary
for (key, value) in myDictionary {

allObjects.append(Cars(carName: key, carModel: value))
}
}

// My TableView
let myTableView: UITableView = {
let tv = UITableView()
tv.translatesAutoresizingMaskIntoConstraints = false
return tv
}()

// My PickerView
let myPickerView: UIPickerView = {
let bp = UIPickerView()
bp.translatesAutoresizingMaskIntoConstraints = false
return bp
}()

// Button Open myPickerView and setup nameCar
var myChoiceCarNameButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("Choice Car", for: .normal)
button.tintColor = .black
button.addTarget(self, action: #selector(handleChoiceCarName), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
return button
}()

// Target selector button "myChoiceCarNameButton"
@objc func handleChoiceCarName() {
print("Tapped choice car name ")

view.layoutIfNeeded()
UIView.animate(withDuration: 0.25, animations: {

self.view.layoutIfNeeded()

}) { (completed) in

UIView.animate(withDuration: 0.25, animations: {

self.myPickerView.alpha = 1
self.view.layoutIfNeeded()
})
}
}

// Constraint button/pickerView/TableView
private func setupUI() {

view.addSubview(myChoiceCarNameButton)
myChoiceCarNameButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true
myChoiceCarNameButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myChoiceCarNameButton.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
myChoiceCarNameButton.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true


view.addSubview(myPickerView)
myPickerView.alpha = 0
myPickerView.topAnchor.constraint(equalTo: myChoiceCarNameButton.bottomAnchor).isActive = true
myPickerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
myPickerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true


view.addSubview(myTableView)
myTableView.topAnchor.constraint(equalTo: myPickerView.bottomAnchor, constant: 10).isActive = true
myTableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
myTableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
myTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 10).isActive = true
}

// MARK: - PickerViewDelegate/DataSource Methods

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

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

if component == 0 {
return allObjects.count
} else {
let selectedBody = pickerView.selectedRow(inComponent: 0)
return allObjects[selectedBody].carName.count
}
}

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

if component == 0 {
return allObjects[row].carName
} else {
let selectedCar = pickerView.selectedRow(inComponent: 0)
return allObjects[selectedCar].carName
}
}

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

// Set the button title
myChoiceCarNameButton.setTitle(allObjects[row].carName, for: .normal)

view.layoutIfNeeded()
UIView.animate(withDuration: 0.25, animations: {

self.myPickerView.alpha = 0
self.view.layoutIfNeeded()

}) { (completed) in

UIView.animate(withDuration: 0.25, animations: {

self.view.layoutIfNeeded()
self.myTableView.reloadData()
})

}

} // End did select



// MARK: - TableViewDelegate/DataSource Methods

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return allObjects[section].carModel.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
cell.backgroundColor = .green

cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 16)
cell.textLabel?.text = allObjects[indexPath.section].carModel[indexPath.row]
return cell
}

} // End class

也许有人发现了类似的情况并且知道该怎么做?也许有人有一个更简单的解决方案如何实现这种效果?

最佳答案

问题就在这里:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return allObjects[section].carModel.count
}

当用户做出选择时,您必须将所选汽车保存在变量中,在 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 中功能。然后在 numberOfRowsInSection函数你必须使用这个变量:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return allObjects[selectedCarIndex].carModel.count
}

此外,您没有指定 func numberOfSections(in tableView: UITableView) -> Int delegate 方法,所以我假设默认值始终为 1,因此 UITableView 中只有 1 个部分。所以在 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int委托(delegate)方法,该部分将始终是 1 ,这就是为什么您在 UITableView 中看不到任何更改的原因。

关于ios - Swift 字典 UIPickerView (键)和 UITableView (值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48195071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com