我試圖用選擇器中提供的顏色更改 UIBackground。我的選擇器作業正常并且可以列印選定的顏色,但是我的問題是讓 selectedColor 通過按下 selectedColorButton 來更改 UIBackground。我以為我可以在 view.backgroundColor = UIColor. 的末尾傳入 selectedColor,但我無法讓它作業,而且我猜想這樣做不正確。
謝謝!
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{
let colors = ["Red", "Green", "Orange", "Yellow", "Pink", "Purple"]
var selectedColor = ""
@IBAction func selectedColorButton(_ sender: UIButton) {
// view.backgroundColor = UIColor.
}
@IBOutlet weak var pickerView: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return colors.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return colors[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
return selectedColor = colors[row]
}
}
uj5u.com熱心網友回復:
正如您所發現的,view.backgroundColor期望一個型別的值,UIColor不幸的是,您所擁有的只是一個String. 沒有直接轉換,但您可以在此處采用兩種方法:
- 運行包含 UIColor 值的第二個陣列
您在這里使用顏色陣列展示您的選擇器選項:
let colors = ["Red", "Green", "Orange", "Yellow", "Pink", "Purple"]
您可以將該實作替換為第二個陣列,該陣列以相同的順序包含實際的 UIColor 值。現在,不是跟蹤選定的名稱,而是跟蹤選定的索引
var selectedIndex = 0
let colorNames = ["Red", "Green", "Orange", "Yellow", "Pink", "Purple"]
let colors: [UIColor] = [.red, .green, .orange, .yellow, .pink, .purple]
使用 顯示您的選項colorNames,然后使用索引訪問colors
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedIndex = row
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return colorNames[row]
}
@IBAction func selectedColorButton(_ sender: UIButton) {
view.backgroundColor = colors[selectedIndex]
}
- 為名稱使用系統屬性
我們可以使用顏色的可訪問性名稱,而不是使用單獨的陣列來存盤名稱。現在,我們只需要一個顏色陣列,我們可以直接存盤選擇的顏色,無需索引跟蹤或名稱選擇
var selectedColor: UIColor? = nil
let colors: [UIColor] = [.red, .green, .orange, .yellow, .pink, .purple]
現在呈現這些顏色選項并使用它們的accessibilityName屬性作為名稱
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedColor = colors[row]
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return colors[row].accessibilityName
}
@IBAction func selectedColorButton(_ sender: UIButton) {
if let color = selectedColor {
view.backgroundColor = color
}
}
第一種方法的優點是我們可以控制名稱。第二種方法的優點是我們為額外資訊節省了記憶體。你的選擇!
您甚至可以嘗試其他方法,例如使用列舉或元組,甚至您自己的類。我建議你都試試!
uj5u.com熱心網友回復:
主要問題是您有一個顏色串列Strings,但您需要UIColors用作背景顏色。我認為最好的方法是使用一個Dictionary,所以每一行都有一個名稱和一個 UIColor。
該功能selectedColorButton沒有做任何事情并且不需要,所以我將其洗掉。
這是完整的代碼:
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{
let colors = [["name": "Red", "color": UIColor.red],
["name": "Green", "color": UIColor.green],
["name": "Orange", "color": UIColor.orange],
["name": "Yellow", "color": UIColor.yellow],
["name": "Pink", "color": UIColor.magenta],
["name": "Purple", "color": UIColor.purple]]
@IBOutlet weak var pickerView: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return colors.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if let name = colors[row]["name"] as? String {
return name
}
return nil
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if let color = colors[row]["color"] as? UIColor {
view.backgroundColor = color
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409121.html
標籤:
