2017-08-15 28 views
0

是否有可能編寫一個通用的UIPickerView子類,你可以傳入任意的枚舉類型,並讓它填充選擇器視圖與所有枚舉的情況?可能使一個通用的枚舉UIPickerView

注意:這需要在enum類型中任意傳遞時進行。

+0

的[乘坐從枚舉數據顯示上UIPickerView斯威夫特(可能的複製https://stackoverflow.com/questions/ 30025481 /取數據從 - 枚舉到節目上-uipickerview-SWIFT) – MwcsMac

回答

0

所以我終於能寫一個通用的枚舉知道選擇器視圖。這就是我所做的。首先,我做了一個PickableEnum協議,像這樣:

protocol PickableEnum: Hashable { 
    static var allValues: [Self] {get} 
    var pickerText: String {get} 
} 

我需要一般瞭解所有的枚舉案件的能力。這是allValues財產的工作,我在網上找到了它的實施。

https://theswiftdev.com/2017/01/05/18-swift-gist-generic-allvalues-for-enums/

下面的代碼:

extension PickableEnum { 

    static func cases() -> AnySequence<Self> { 
     typealias S = Self 
     return AnySequence {() -> AnyIterator<S> in 
     var raw = 0 
     return AnyIterator { 
      let current : Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: S.self, capacity: 1) { $0.pointee } } 
      guard current.hashValue == raw else { return nil } 
      raw += 1 
      return current 
     } 
     } 
    } 

    static var allValues: [Self] { 
     return Array(self.cases()) 
    } 
} 

的PickableEnum也有稱爲pickerText只讀字符串屬性用於獲取將出現在挑選器界面的文字。其他都是微不足道的。讓你的UI類採取相應類型的通用預選賽,然後相應地配置UIPickerView:

class EnumPickerView<T:PickableEnum> : UIPickerView, UIPickerViewDelegate, UIPickerViewDataSource { 

    private let enumCases = T.allValues 
    private var currentValue: T 

    init(frame: CGRect, initialValue: T) { 
     currentValue = initialValue 
     super.init(frame: frame) 
     dataSource = self 
     delegate = self 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    var value: T { 
     get { 
     return currentValue 
     } 
    } 

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

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

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return enumCases[row].pickerText 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     currentValue = enumCases[row] 
    } 
} 
0

試試這個:

enum SomeValues: Int { 

    static var count: Int { return SomeValues.lastValue.hashValue + 1 } 

    case valueA = 0 
    case valueB = 1 
    case valueC = 2 
    case lastValue = 3 
    case noValue = 4 

    func rawString() -> String { 
     return String(describing: self) 
    } 
} 

使用值的選擇器:

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

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

// MARK: - UIPickerViewDelegate 

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

    guard let value = SomeValues(rawValue: component), value != .noValue else { return "Handle however you want" } 

    return value.rawString() 
}