从Enum获取数据以在UIPickerView上显示

Sop*_*mer 1 enums uipickerview ios swift

我正在创建一个简单的视图,其中有一个UIPickerView,我想从枚举中显示PickerView上的选项.我创造了一种可能的饮料

enum drink{
  case coffee
  case tea
  case cola
  case water
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何在UIPickerView中显示饮料?我正在使用Swift 1.2和Xcode 6.3.1 ..谢谢!! :)

Kum*_*uzz 5

如上所述,ABakerSmith您可以使用Printable协议显示StringUIPickerView.

最后,您可以ViewController看到以下内容:

//
//  ViewController.swift
//  Test
//
//  Created by Stefan Veis Pennerup on 04/05/15.
//  Copyright (c) 2015 Kumuluzz. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var pickerView: UIPickerView!

enum Drink: Int, Printable {
    case Coffee = 0
    case Tea = 1
    case Cola = 2
    case Water = 3
    static var count: Int { return Drink.Water.hashValue + 1 }

    var description: String {
        switch self {
        case .Coffee: return "Coffee"
        case .Tea   : return "Tea"
        case .Cola  : return "Cola"
        case .Water : return "Water"
        default: return ""
        }
    }
}

// MARK: - UIPickerViewDataSource

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

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return Drink.count.hashValue
}

// MARK: - UIPickerViewDelegate

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return Drink(rawValue: row)?.description;
}

// several optional methods:

// func pickerView(pickerView: UIPickerView!, widthForComponent component: Int) -> CGFloat

// func pickerView(pickerView: UIPickerView!, rowHeightForComponent component: Int) -> CGFloat

// func pickerView(pickerView: UIPickerView!, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString!

// func pickerView(pickerView: UIPickerView!, viewForRow row: Int, forComponent component: Int, reusingView view: UIView!) -> UIView!

// func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
}
Run Code Online (Sandbox Code Playgroud)


yot*_*erg 5

Apple 在 Swift 4.2 / Xcode 10+ 中引入了CaseIterable,这使得它更干净。

编译器可以自动为任何枚举提供 CaseIterable 要求的实现,而无需在其案例上关联值或 @available 属性。合成的 allCases 集合按照声明的顺序提供案例。

例子:

enum Drink: String, CaseIterable {
    case coffee = "Coffee"
    case tea = "Tea"
    case cola = "Cola"
    case water = "Water"
}

extension ViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return Drink.allCases[row].rawValue
    }
}

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Drink.allCases.count
    }
}
Run Code Online (Sandbox Code Playgroud)

UITextField您可以在Github上找到使用的完整示例