From 7a55035cfd228e34403b1644bb7461e5e0020e3a Mon Sep 17 00:00:00 2001 From: luyiyang Date: Wed, 24 Jul 2019 22:07:06 +0800 Subject: [PATCH 1/2] convert to swift 5 --- Source/Picker.swift | 124 +++++++------- Source/PickerView.swift | 289 ++++++++++++++++++-------------- Source/SelectionTextField.swift | 60 +++---- Source/ToolBarView.swift | 48 +++--- Source/UsefulPickerView.swift | 85 +++++----- 5 files changed, 318 insertions(+), 288 deletions(-) diff --git a/Source/Picker.swift b/Source/Picker.swift index 110620c..6975191 100755 --- a/Source/Picker.swift +++ b/Source/Picker.swift @@ -39,8 +39,8 @@ struct AssociatedDataModel { } class Picker: UIView { - let screenWidth = UIScreen.mainScreen().bounds.size.width - let screenHeight = UIScreen.mainScreen().bounds.size.height + let screenWidth = UIScreen.main.bounds.size.width + let screenHeight = UIScreen.main.bounds.size.height // 使用模型初始化数据示例 let associatedData: [[AssociatedDataModel]] = [ @@ -72,37 +72,37 @@ class Picker: UIView { enum PickerStyles { - case Single - case Multiple - case MultipleAssociated + case single + case multiple + case multipleAssociated } - var pickerStyle: PickerStyles = .Single + var pickerStyle: PickerStyles = .single // 完成按钮的响应Closure typealias BtnAction = () -> Void - typealias SingleDoneAction = (selectedIndex: Int, selectedValue: String) -> Void - typealias MultipleDoneAction = (selectedIndexs: [Int], selectedValues: [String]) -> Void + typealias SingleDoneAction = (_ selectedIndex: Int, _ selectedValue: String) -> Void + typealias MultipleDoneAction = (_ selectedIndexs: [Int], _ selectedValues: [String]) -> Void - private var cancelAction: BtnAction? = nil { + fileprivate var cancelAction: BtnAction? = nil { didSet { tool.cancelAction = cancelAction } } //MARK:- 只有一列的时候用到的属性 - private var singleDoneOnClick:SingleDoneAction? = nil { + fileprivate var singleDoneOnClick:SingleDoneAction? = nil { didSet { tool.doneAction = {[unowned self] in - self.singleDoneOnClick?(selectedIndex: self.selectedIndex, selectedValue: self.selectedValue) + self.singleDoneOnClick?(self.selectedIndex, self.selectedValue) } } } - private var defalultSelectedIndex: Int? = nil { + fileprivate var defalultSelectedIndex: Int? = nil { didSet { - if let defaultIndex = defalultSelectedIndex, singleData = singleColData {// 判断下标是否合法 + if let defaultIndex = defalultSelectedIndex, let singleData = singleColData {// 判断下标是否合法 assert(defaultIndex >= 0 && defaultIndex < singleData.count, "设置的默认选中Index不合法") if defaultIndex >= 0 && defaultIndex < singleData.count { // 设置默认值 @@ -121,10 +121,10 @@ class Picker: UIView { } } } - private var singleColData: [String]? = nil + fileprivate var singleColData: [String]? = nil - private var selectedIndex: Int = 0 - private var selectedValue: String = "" + fileprivate var selectedIndex: Int = 0 + fileprivate var selectedValue: String = "" //MARK:- 有多列不关联的时候用到的属性 @@ -132,12 +132,12 @@ class Picker: UIView { didSet { tool.doneAction = {[unowned self] in - self.multipleDoneOnClick?(selectedIndexs: self.selectedIndexs, selectedValues: self.selectedValues) + self.multipleDoneOnClick?(self.selectedIndexs, self.selectedValues) } } } - private var multipleColsData: [[String]]? = nil { + fileprivate var multipleColsData: [[String]]? = nil { didSet { if let multipleData = multipleColsData { for _ in multipleData.indices { @@ -149,17 +149,17 @@ class Picker: UIView { } } - private var selectedIndexs: [Int] = [] - private var selectedValues: [String] = [] + fileprivate var selectedIndexs: [Int] = [] + fileprivate var selectedValues: [String] = [] - private var defalultSelectedIndexs: [Int]? = nil { + fileprivate var defalultSelectedIndexs: [Int]? = nil { didSet { if let defaultIndexs = defalultSelectedIndexs { - defaultIndexs.enumerate().forEach({ (component: Int, row: Int) in + defaultIndexs.enumerated().forEach({ (component: Int, row: Int) in - assert(component < pickerView.numberOfComponents && row < pickerView.numberOfRowsInComponent(component), "设置的默认选中Indexs有不合法的") - if component < pickerView.numberOfComponents && row < pickerView.numberOfRowsInComponent(component){ + assert(component < pickerView.numberOfComponents && row < pickerView.numberOfRows(inComponent: component), "设置的默认选中Indexs有不合法的") + if component < pickerView.numberOfComponents && row < pickerView.numberOfRows(inComponent: component){ // 滚动到默认位置 pickerView.selectRow(row, inComponent: component, animated: false) @@ -192,7 +192,7 @@ class Picker: UIView { //MARK:- 有多列关联的时候用到的属性 - private var multipleAssociatedColsData: [[AssociatedDataModel]]? = nil { + fileprivate var multipleAssociatedColsData: [[AssociatedDataModel]]? = nil { didSet { if let multipleAssociatedData = multipleAssociatedColsData { @@ -206,17 +206,17 @@ class Picker: UIView { } // 设置第一组的数据, 使用数组是因为字典无序,需要设置默认选中值的时候获取到准确的下标滚动到相应的行 - private var defaultSelectedValues: [String]? = nil { + fileprivate var defaultSelectedValues: [String]? = nil { didSet { if let defaultValues = defaultSelectedValues { // 设置默认值 selectedValues = defaultValues - defaultValues.enumerate().forEach { (component: Int, element: String) in + defaultValues.enumerated().forEach { (component: Int, element: String) in var row: Int? = nil if component == 0 { let firstData = multipleAssociatedColsData![0] - for (index,associatedModel) in firstData.enumerate() { + for (index,associatedModel) in firstData.enumerated() { if associatedModel.key == element { row = index } @@ -232,7 +232,7 @@ class Picker: UIView { } } - row = arr?.indexOf(element) + row = arr?.index(of: element) } @@ -268,20 +268,20 @@ class Picker: UIView { - private lazy var pickerView: UIPickerView! = { [unowned self] in + fileprivate lazy var pickerView: UIPickerView! = { [unowned self] in let picker = UIPickerView() picker.delegate = self picker.dataSource = self - picker.backgroundColor = UIColor.whiteColor() + picker.backgroundColor = UIColor.white return picker }() - private lazy var tool: ToolBarView! = ToolBarView() + fileprivate lazy var tool: ToolBarView! = ToolBarView() - private let pickerViewHeight = 216.0 - private let toolBarHeight = 44.0 + fileprivate let pickerViewHeight = 216.0 + fileprivate let toolBarHeight = 44.0 - let screenW = UIScreen.mainScreen().bounds.size.width + let screenW = UIScreen.main.bounds.size.width //MARK:- 初始化 init() { @@ -315,28 +315,28 @@ class Picker: UIView { } extension Picker: UIPickerViewDelegate, UIPickerViewDataSource { - func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { + func numberOfComponents(in pickerView: UIPickerView) -> Int { switch pickerStyle { - case .Single: + case .single: return singleColData == nil ? 0 : 1 - case .Multiple: + case .multiple: return multipleColsData?.count ?? 0 - case .MultipleAssociated: + case .multipleAssociated: return multipleAssociatedColsData?.count ?? 0 } } - func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { switch pickerStyle { - case .Single: + case .single: return singleColData?.count ?? 0 - case .Multiple: + case .multiple: return multipleColsData?[component].count ?? 0 - case .MultipleAssociated: + case .multipleAssociated: if let multipleAssociatedData = multipleAssociatedColsData { if component == 0 { @@ -363,15 +363,15 @@ extension Picker: UIPickerViewDelegate, UIPickerViewDataSource { } - func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { switch pickerStyle { - case .Single: + case .single: selectedIndex = row selectedValue = singleColData![row] - case .Multiple: + case .multiple: selectedIndexs[component] = row selectedValues[component] = self.pickerView(pickerView, titleForRow: row, forComponent: component) ?? " " - case .MultipleAssociated: + case .multipleAssociated: // 设置选中值 selectedValues[component] = self.pickerView(pickerView, titleForRow: row, forComponent: component) ?? " " selectedIndexs[component] = row @@ -388,13 +388,13 @@ extension Picker: UIPickerViewDelegate, UIPickerViewDataSource { } - func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { + func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { switch pickerStyle { - case .Single: + case .single: return singleColData?[row] - case .Multiple: + case .multiple: return multipleColsData?[component][row] - case .MultipleAssociated: + case .multipleAssociated: if let multipleAssociatedData = multipleAssociatedColsData { @@ -428,10 +428,10 @@ extension Picker: UIPickerViewDelegate, UIPickerViewDataSource { extension Picker { /// 单列 - class func singleColPicker(singleColData: [String], defaultIndex: Int?,cancelAction: BtnAction?, doneAction: SingleDoneAction?) -> Picker { + class func singleColPicker(_ singleColData: [String], defaultIndex: Int?,cancelAction: BtnAction?, doneAction: SingleDoneAction?) -> Picker { let pic = Picker() - pic.pickerStyle = .Single + pic.pickerStyle = .single pic.singleColData = singleColData pic.defalultSelectedIndex = defaultIndex @@ -442,11 +442,11 @@ extension Picker { } /// 多列不关联 - class func multipleCosPicker(multipleColsData: [[String]], defaultSelectedIndexs: [Int]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { + class func multipleCosPicker(_ multipleColsData: [[String]], defaultSelectedIndexs: [Int]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { let pic = Picker() - pic.pickerStyle = .Multiple + pic.pickerStyle = .multiple pic.multipleColsData = multipleColsData pic.defalultSelectedIndexs = defaultSelectedIndexs @@ -457,10 +457,10 @@ extension Picker { } /// 多列关联 - class func multipleAssociatedCosPicker(multipleAssociatedColsData: [[AssociatedDataModel]], defaultSelectedValues: [String]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { + class func multipleAssociatedCosPicker(_ multipleAssociatedColsData: [[AssociatedDataModel]], defaultSelectedValues: [String]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { let pic = Picker() - pic.pickerStyle = .MultipleAssociated + pic.pickerStyle = .multipleAssociated pic.multipleAssociatedColsData = multipleAssociatedColsData pic.defaultSelectedValues = defaultSelectedValues @@ -471,11 +471,11 @@ extension Picker { } /// 城市选择器 - class func citiesPicker(defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { + class func citiesPicker(_ defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { - let provincePath = NSBundle.mainBundle().pathForResource("Province", ofType: "plist") - let cityPath = NSBundle.mainBundle().pathForResource("City", ofType: "plist") - let areaPath = NSBundle.mainBundle().pathForResource("Area", ofType: "plist") + let provincePath = Bundle.main.path(forResource: "Province", ofType: "plist") + let cityPath = Bundle.main.path(forResource: "City", ofType: "plist") + let areaPath = Bundle.main.path(forResource: "Area", ofType: "plist") let proviceArr = NSArray(contentsOfFile: provincePath!) let cityArr = NSDictionary(contentsOfFile: cityPath!) @@ -508,4 +508,4 @@ extension Picker { return pic } -} \ No newline at end of file +} diff --git a/Source/PickerView.swift b/Source/PickerView.swift index 55b5b39..693dcda 100755 --- a/Source/PickerView.swift +++ b/Source/PickerView.swift @@ -32,75 +32,79 @@ import UIKit //MARK:- PickerViewDelegate 用于自动设置TextField的选中值 public protocol PickerViewDelegate: class { - func singleColDidSelecte(selectedIndex: Int, selectedValue: String) - func multipleColsDidSelecte(selectedIndexs: [Int], selectedValues: [String]) - func dateDidSelecte(selectedDate: NSDate) + func singleColDidSelecte(_ selectedIndex: Int, selectedValue: String) + func multipleColsDidSelecte(_ selectedIndexs: [Int], selectedValues: [String]) + func dateDidSelecte(_ selectedDate: Date) } //MARK:- 配置UIDatePicker的样式 public struct DatePickerSetting { - - public var date = NSDate() - public var dateMode = UIDatePickerMode.Date - public var minimumDate: NSDate? - public var maximumDate: NSDate? + /// 默认选中时间 + public var date = Date() + public var dateMode = UIDatePicker.Mode.date + //最小时间 + public var minimumDate: Date? + // 最大时间 + public var maximumDate: Date? public init() { } } //MARK:- PickerView -public class PickerView: UIView { - private let screenWidth = UIScreen.mainScreen().bounds.size.width - private let pickerViewHeight = 216.0 - private let toolBarHeight = 44.0 +open class PickerView: UIView { + fileprivate let screenWidth = UIScreen.main.bounds.size.width + fileprivate let pickerViewHeight = 216.0 + fileprivate let toolBarHeight = 44.0 public enum PickerStyles { - case Single - case Multiple - case MultipleAssociated - case Date + case single + case multiple + case multipleAssociated + case date } - public weak var delegate: PickerViewDelegate? - private var toolBarTitle = "请选择" { + open weak var delegate: PickerViewDelegate? + fileprivate var toolBarTitle = "请选择" { didSet { toolBar.title = toolBarTitle } } - private var pickerStyle: PickerStyles = .Single + fileprivate var pickerStyle: PickerStyles = .single // 配置UIDatePicker的样式 - private var datePickerSetting = DatePickerSetting() { + fileprivate var datePickerSetting = DatePickerSetting() { didSet { datePicker.date = datePickerSetting.date datePicker.minimumDate = datePickerSetting.minimumDate datePicker.maximumDate = datePickerSetting.maximumDate datePicker.datePickerMode = datePickerSetting.dateMode + /// set currentDate to the default + selectedDate = datePickerSetting.date } } // 完成按钮的响应Closure public typealias BtnAction = () -> Void - public typealias SingleDoneAction = (selectedIndex: Int, selectedValue: String) -> Void - public typealias MultipleDoneAction = (selectedIndexs: [Int], selectedValues: [String]) -> Void - public typealias DateDoneAction = (selectedDate: NSDate) -> Void + public typealias SingleDoneAction = (_ selectedIndex: Int, _ selectedValue: String) -> Void + public typealias MultipleDoneAction = (_ selectedIndexs: [Int], _ selectedValues: [String]) -> Void + public typealias DateDoneAction = (_ selectedDate: Date) -> Void public typealias MultipleAssociatedDataType = [[[String: [String]?]]] - private var cancelAction: BtnAction? = nil { + fileprivate var cancelAction: BtnAction? = nil { didSet { toolBar.cancelAction = cancelAction } } //MARK:- 只有一列的时候用到的属性 - private var singleDoneOnClick:SingleDoneAction? = nil { + fileprivate var singleDoneOnClick:SingleDoneAction? = nil { didSet { toolBar.doneAction = {[unowned self] in - self.singleDoneOnClick?(selectedIndex: self.selectedIndex, selectedValue: self.selectedValue) + self.singleDoneOnClick?(self.selectedIndex, self.selectedValue) } } } - private var defalultSelectedIndex: Int? = nil { + fileprivate var defalultSelectedIndex: Int? = nil { didSet { - if let defaultIndex = defalultSelectedIndex, singleData = singleColData {// 判断下标是否合法 + if let defaultIndex = defalultSelectedIndex, let singleData = singleColData {// 判断下标是否合法 assert(defaultIndex >= 0 && defaultIndex < singleData.count, "设置的默认选中Index不合法") if defaultIndex >= 0 && defaultIndex < singleData.count { // 设置默认值 @@ -119,10 +123,10 @@ public class PickerView: UIView { } } } - private var singleColData: [String]? = nil + fileprivate var singleColData: [String]? = nil - private var selectedIndex: Int = 0 - private var selectedValue: String = "" { + fileprivate var selectedIndex: Int = 0 + fileprivate var selectedValue: String = "" { didSet { delegate?.singleColDidSelecte(selectedIndex, selectedValue: selectedValue) } @@ -130,16 +134,16 @@ public class PickerView: UIView { //MARK:- 有多列不关联的时候用到的属性 - private var multipleDoneOnClick:MultipleDoneAction? = nil { + fileprivate var multipleDoneOnClick:MultipleDoneAction? = nil { didSet { toolBar.doneAction = {[unowned self] in - self.multipleDoneOnClick?(selectedIndexs: self.selectedIndexs, selectedValues: self.selectedValues) + self.multipleDoneOnClick?(self.selectedIndexs, self.selectedValues) } } } - private var multipleColsData: [[String]]? = nil { + fileprivate var multipleColsData: [[String]]? = nil { didSet { if let multipleData = multipleColsData { for _ in multipleData.indices { @@ -151,30 +155,33 @@ public class PickerView: UIView { } } - private var selectedIndexs: [Int] = [] - private var selectedValues: [String] = [] { + fileprivate var selectedIndexs: [Int] = [] + fileprivate var selectedValues: [String] = [] { didSet { delegate?.multipleColsDidSelecte(selectedIndexs, selectedValues: selectedValues) } } // 不关联的数据时直接设置默认的下标 - private var defalultSelectedIndexs: [Int]? = nil { + fileprivate var defalultSelectedIndexs: [Int]? = nil { didSet { if let defaultIndexs = defalultSelectedIndexs { - defaultIndexs.enumerate().forEach({ (component: Int, row: Int) in + defaultIndexs.enumerated().forEach({ (component: Int, row: Int) in - assert(component < pickerView.numberOfComponents && row < pickerView.numberOfRowsInComponent(component), "设置的默认选中Indexs有不合法的") - if component < pickerView.numberOfComponents && row < pickerView.numberOfRowsInComponent(component){ + assert(component < pickerView.numberOfComponents && row < pickerView.numberOfRows(inComponent: component), "设置的默认选中Indexs有不合法的") + if component < pickerView.numberOfComponents && row < pickerView.numberOfRows(inComponent: component){ // 滚动到默认位置 - pickerView.selectRow(row, inComponent: component, animated: false) // 设置默认值 selectedIndexs[component] = row selectedValues[component] = titleForRow(row, forComponent: component) ?? " " - + DispatchQueue.main.async(execute: { + + self.pickerView.selectRow(row, inComponent: component, animated: false) + }) + } }) @@ -197,7 +204,7 @@ public class PickerView: UIView { //MARK:- 有多列关联的时候用到的属性 - private var multipleAssociatedColsData: MultipleAssociatedDataType? = nil { + fileprivate var multipleAssociatedColsData: MultipleAssociatedDataType? = nil { didSet { if let multipleAssociatedData = multipleAssociatedColsData { @@ -211,19 +218,19 @@ public class PickerView: UIView { } // 多列关联数据的时候设置默认的values而没有使用默认的index - private var defaultSelectedValues: [String]? = nil { + fileprivate var defaultSelectedValues: [String]? = nil { didSet { if let defaultValues = defaultSelectedValues { - // 设置默认值 - selectedValues = defaultValues - defaultValues.enumerate().forEach { (component: Int, element: String) in + // this is a wrong way cause defaultValues is less than components' count +// selectedValues = defaultValues + defaultValues.enumerated().forEach { (component: Int, element: String) in var row: Int? = nil if component == 0 { let firstData = multipleAssociatedColsData![0] - for (index,associatedModel) in firstData.enumerate() { + for (index,associatedModel) in firstData.enumerated() { if associatedModel.first!.0 == element { row = index break @@ -236,12 +243,12 @@ public class PickerView: UIView { for associatedModel in associatedModels { - if associatedModel.first!.0 == selectedValues[component - 1] { + if associatedModel.first!.0 == defaultValues[component - 1] { arr = associatedModel.first!.1 break } } - row = arr?.indexOf(element) + row = arr?.index(of: element) } @@ -252,15 +259,22 @@ public class PickerView: UIView { } if component < pickerView.numberOfComponents { // print(" \(component) ----\(row!)") - // 滚动到默认的位置 - pickerView.selectRow(row!, inComponent: component, animated: false) + // 设置选中的下标 selectedIndexs[component] = row! - + // 设置默认值 + selectedValues[component] = titleForRow(row!, forComponent: component) ?? " " + // 滚动到默认的位置 + DispatchQueue.main.async(execute: { + + self.pickerView.selectRow(row!, inComponent: component, animated: false) + }) + } } + } else { for index in 0...multipleAssociatedColsData!.count { // 滚动到默认的位置 0 行 @@ -277,37 +291,37 @@ public class PickerView: UIView { } // MARK:- 日期选择器用到的属性 - private var selectedDate = NSDate() { + fileprivate var selectedDate = Date() { didSet { delegate?.dateDidSelecte(selectedDate) } } - private var dateDoneAction: DateDoneAction? { + fileprivate var dateDoneAction: DateDoneAction? { didSet { toolBar.doneAction = {[unowned self] in - self.dateDoneAction?(selectedDate: self.selectedDate) + self.dateDoneAction?(self.selectedDate) } } } - private lazy var pickerView: UIPickerView! = { [unowned self] in + fileprivate lazy var pickerView: UIPickerView! = { [unowned self] in let picker = UIPickerView() picker.delegate = self picker.dataSource = self - picker.backgroundColor = UIColor.whiteColor() + picker.backgroundColor = UIColor.white return picker }() - private lazy var datePicker: UIDatePicker = {[unowned self] in + fileprivate lazy var datePicker: UIDatePicker = {[unowned self] in let datePic = UIDatePicker() - datePic.backgroundColor = UIColor.whiteColor() + datePic.backgroundColor = UIColor.white // print(NSLocale.availableLocaleIdentifiers()) - datePic.locale = NSLocale(localeIdentifier: "zh_CN") + datePic.locale = Locale(identifier: "zh_CN") return datePic }() - private lazy var toolBar: ToolBarView! = ToolBarView() + fileprivate lazy var toolBar: ToolBarView! = ToolBarView() //MARK:- 初始化 public init(pickerStyle: PickerStyles) { @@ -331,31 +345,30 @@ public class PickerView: UIView { print("\(self.debugDescription) --- 销毁") } - private func commonInit() { + fileprivate func commonInit() { addSubview(toolBar) - if pickerStyle == PickerStyles.Date { - datePicker.addTarget(self, action: #selector(self.dateDidChange(_:)), forControlEvents: UIControlEvents.ValueChanged) + if pickerStyle == PickerStyles.date { + datePicker.addTarget(self, action: #selector(dateDidChange(_:)), for: .valueChanged) addSubview(datePicker) } else { addSubview(pickerView) - } } - func dateDidChange(datePic: UIDatePicker) { + @objc func dateDidChange(_ datePic: UIDatePicker) { selectedDate = datePic.date } - override public func layoutSubviews() { + override open func layoutSubviews() { super.layoutSubviews() - let toolBarX = NSLayoutConstraint(item: toolBar, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1.0, constant: 0.0) + let toolBarX = NSLayoutConstraint(item: toolBar, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0) - let toolBarY = NSLayoutConstraint(item: toolBar, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0.0) - let toolBarW = NSLayoutConstraint(item: toolBar, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0.0) - let toolBarH = NSLayoutConstraint(item: toolBar, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: CGFloat(toolBarHeight)) + let toolBarY = NSLayoutConstraint(item: toolBar, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0) + let toolBarW = NSLayoutConstraint(item: toolBar, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1.0, constant: 0.0) + let toolBarH = NSLayoutConstraint(item: toolBar, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: CGFloat(toolBarHeight)) toolBar.translatesAutoresizingMaskIntoConstraints = false addConstraints([toolBarX, toolBarY, toolBarW, toolBarH]) @@ -366,25 +379,25 @@ public class PickerView: UIView { // 改用了autolayout // toolBar.frame = CGRect(x: 0.0, y: 0.0, width: Double(screenWidth), height: toolBarHeight) - if pickerStyle == PickerStyles.Date { + if pickerStyle == PickerStyles.date { // datePicker.frame = CGRect(x: 0.0, y: toolBarHeight, width: Double(screenWidth), height: pickerViewHeight) - let pickerX = NSLayoutConstraint(item: datePicker, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1.0, constant: 0.0) + let pickerX = NSLayoutConstraint(item: datePicker, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0) - let pickerY = NSLayoutConstraint(item: datePicker, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: CGFloat(toolBarHeight)) - let pickerW = NSLayoutConstraint(item: datePicker, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0.0) - let pickerH = NSLayoutConstraint(item: datePicker, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: CGFloat(pickerViewHeight)) + let pickerY = NSLayoutConstraint(item: datePicker, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: CGFloat(toolBarHeight)) + let pickerW = NSLayoutConstraint(item: datePicker, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1.0, constant: 0.0) + let pickerH = NSLayoutConstraint(item: datePicker, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: CGFloat(pickerViewHeight)) datePicker.translatesAutoresizingMaskIntoConstraints = false addConstraints([pickerX, pickerY, pickerW, pickerH]) } else { // pickerView.frame = CGRect(x: 0.0, y: toolBarHeight, width: Double(screenWidth), height: pickerViewHeight) - let pickerX = NSLayoutConstraint(item: pickerView, attribute: .Leading, relatedBy: .Equal, toItem: self, attribute: .Leading, multiplier: 1.0, constant: 0.0) + let pickerX = NSLayoutConstraint(item: pickerView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0) - let pickerY = NSLayoutConstraint(item: pickerView, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: CGFloat(toolBarHeight)) - let pickerW = NSLayoutConstraint(item: pickerView, attribute: .Width, relatedBy: .Equal, toItem: self, attribute: .Width, multiplier: 1.0, constant: 0.0) - let pickerH = NSLayoutConstraint(item: pickerView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: CGFloat(pickerViewHeight)) + let pickerY = NSLayoutConstraint(item: pickerView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: CGFloat(toolBarHeight)) + let pickerW = NSLayoutConstraint(item: pickerView, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1.0, constant: 0.0) + let pickerH = NSLayoutConstraint(item: pickerView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: CGFloat(pickerViewHeight)) pickerView.translatesAutoresizingMaskIntoConstraints = false addConstraints([pickerX, pickerY, pickerW, pickerH]) @@ -397,28 +410,28 @@ public class PickerView: UIView { } //MARK: UIPickerViewDelegate, UIPickerViewDataSource extension PickerView: UIPickerViewDelegate, UIPickerViewDataSource { - final public func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { + final public func numberOfComponents(in pickerView: UIPickerView) -> Int { switch pickerStyle { - case .Single: + case .single: return singleColData == nil ? 0 : 1 - case .Multiple: + case .multiple: return multipleColsData?.count ?? 0 - case .MultipleAssociated: + case .multipleAssociated: return multipleAssociatedColsData == nil ? 0 : multipleAssociatedColsData!.count+1 default: return 0 } } - final public func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + final public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { switch pickerStyle { - case .Single: + case .single: return singleColData?.count ?? 0 - case .Multiple: + case .multiple: return multipleColsData?[component].count ?? 0 - case .MultipleAssociated: + case .multipleAssociated: if let multipleAssociatedData = multipleAssociatedColsData { if component == 0 { @@ -444,25 +457,31 @@ extension PickerView: UIPickerViewDelegate, UIPickerViewDataSource { } - final public func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + final public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { switch pickerStyle { - case .Single: + case .single: selectedIndex = row selectedValue = singleColData![row] - case .Multiple: + case .multiple: selectedIndexs[component] = row - selectedValues[component] = titleForRow(row, forComponent: component) ?? " " - case .MultipleAssociated: + if let title = titleForRow(row, forComponent: component) { + selectedValues[component] = title + } + case .multipleAssociated: // 设置选中值 - selectedValues[component] = titleForRow(row, forComponent: component) ?? " " - selectedIndexs[component] = row - // 更新下一列关联的值 - if component < multipleAssociatedColsData!.count { - pickerView.reloadComponent(component + 1) - // 递归 - self.pickerView(pickerView, didSelectRow: 0, inComponent: component+1) - pickerView.selectRow(0, inComponent: component+1, animated: true) - + + if let title = titleForRow(row, forComponent: component) { + selectedValues[component] = title + selectedIndexs[component] = row + // 更新下一列关联的值 + if component < multipleAssociatedColsData!.count { + pickerView.reloadComponent(component + 1) + // 递归 + self.pickerView(pickerView, didSelectRow: 0, inComponent: component+1) + pickerView.selectRow(0, inComponent: component+1, animated: true) + + } + } @@ -472,27 +491,27 @@ extension PickerView: UIPickerViewDelegate, UIPickerViewDataSource { } - final public func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { + final public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { let label = UILabel() - label.textAlignment = .Center + label.textAlignment = .center label.adjustsFontSizeToFitWidth = true - label.textColor = UIColor.blackColor() - label.font = UIFont.systemFontOfSize(18.0) - label.backgroundColor = UIColor.clearColor() + label.textColor = UIColor.black + label.font = UIFont.systemFont(ofSize: 18.0) + label.backgroundColor = UIColor.clear label.text = titleForRow(row, forComponent: component) return label } // Helper - private func titleForRow(row: Int, forComponent component: Int) -> String? { + fileprivate func titleForRow(_ row: Int, forComponent component: Int) -> String? { switch pickerStyle { - case .Single: + case .single: return singleColData?[row] - case .Multiple: + case .multiple: return multipleColsData?[component][row] - case .MultipleAssociated: + case .multipleAssociated: if let multipleAssociatedData = multipleAssociatedColsData { @@ -528,8 +547,8 @@ extension PickerView: UIPickerViewDelegate, UIPickerViewDataSource { extension PickerView { /// 单列 - public class func singleColPicker(toolBarTitle: String, singleColData: [String], defaultIndex: Int?,cancelAction: BtnAction?, doneAction: SingleDoneAction?) -> PickerView { - let pic = PickerView(pickerStyle: .Single) + public class func singleColPicker(_ toolBarTitle: String, singleColData: [String], defaultIndex: Int?,cancelAction: BtnAction?, doneAction: SingleDoneAction?) -> PickerView { + let pic = PickerView(pickerStyle: .single) pic.toolBarTitle = toolBarTitle pic.singleColData = singleColData @@ -542,9 +561,9 @@ extension PickerView { } /// 多列不关联 - public class func multipleCosPicker(toolBarTitle: String, multipleColsData: [[String]], defaultSelectedIndexs: [Int]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> PickerView { + public class func multipleCosPicker(_ toolBarTitle: String, multipleColsData: [[String]], defaultSelectedIndexs: [Int]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> PickerView { - let pic = PickerView(pickerStyle: .Multiple) + let pic = PickerView(pickerStyle: .multiple) pic.toolBarTitle = toolBarTitle pic.multipleColsData = multipleColsData @@ -556,9 +575,9 @@ extension PickerView { } /// 多列关联 - public class func multipleAssociatedCosPicker(toolBarTitle: String, multipleAssociatedColsData: MultipleAssociatedDataType, defaultSelectedValues: [String]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> PickerView { + public class func multipleAssociatedCosPicker(_ toolBarTitle: String, multipleAssociatedColsData: MultipleAssociatedDataType, defaultSelectedValues: [String]?,cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> PickerView { - let pic = PickerView(pickerStyle: .MultipleAssociated) + let pic = PickerView(pickerStyle: .multipleAssociated) pic.toolBarTitle = toolBarTitle pic.multipleAssociatedColsData = multipleAssociatedColsData @@ -571,11 +590,11 @@ extension PickerView { /// 城市选择器 - public class func citiesPicker(toolBarTitle: String, defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> PickerView { + public class func citiesPicker(_ toolBarTitle: String, defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?, selectTopLevel:Bool = false) -> PickerView { - let provincePath = NSBundle.mainBundle().pathForResource("Province", ofType: "plist") - let cityPath = NSBundle.mainBundle().pathForResource("City", ofType: "plist") - let areaPath = NSBundle.mainBundle().pathForResource("Area", ofType: "plist") + let provincePath = Bundle.main.path(forResource: "Province", ofType: "plist") + let cityPath = Bundle.main.path(forResource: "City", ofType: "plist") + let areaPath = Bundle.main.path(forResource: "Area", ofType: "plist") // 这里需要使用数组, 因为字典无序, 如果只使用 cityArr,areaArr, 那么显示将是无序的, 不能按照plist中的数组显示 let proviceArr = NSArray(contentsOfFile: provincePath!) let cityArr = NSDictionary(contentsOfFile: cityPath!) @@ -587,13 +606,25 @@ extension PickerView { proviceArr?.forEach({ (element) in if let provinceStr = element as? String { - let cities = cityArr?[provinceStr] as? [String] + var cities = cityArr?[provinceStr] as? [String] + if selectTopLevel { + cities?.insert("/", at: 0) + } citiesModelArr.append([provinceStr: cities]) cities?.forEach({ (city) in - let areas = areaArr?[city]as? [String] - areasModelArr.append([city: areas]) - + if city == "/" { + areasModelArr.append([city: ["/"]]) + } + else { + var areas = areaArr?[city]as? [String] + + if selectTopLevel { + areas!.insert("/", at: 0) + } + areasModelArr.append([city: areas]) + } + }) } }) @@ -607,9 +638,9 @@ extension PickerView { } /// 时间选择器 - public class func datePicker(toolBarTitle: String, datePickerSetting: DatePickerSetting, cancelAction: BtnAction?, doneAction: DateDoneAction?) -> PickerView { + public class func datePicker(_ toolBarTitle: String, datePickerSetting: DatePickerSetting, cancelAction: BtnAction?, doneAction: DateDoneAction?) -> PickerView { - let pic = PickerView(pickerStyle: .Date) + let pic = PickerView(pickerStyle: .date) pic.datePickerSetting = datePickerSetting pic.toolBarTitle = toolBarTitle pic.cancelAction = cancelAction @@ -618,4 +649,4 @@ extension PickerView { } -} \ No newline at end of file +} diff --git a/Source/SelectionTextField.swift b/Source/SelectionTextField.swift index de78e97..6804b7c 100755 --- a/Source/SelectionTextField.swift +++ b/Source/SelectionTextField.swift @@ -30,19 +30,19 @@ import UIKit -public class SelectionTextField: UITextField { +open class SelectionTextField: UITextField { public typealias BtnAction = () -> Void - public typealias SingleDoneAction = (textField: UITextField, selectedIndex: Int, selectedValue: String) -> Void - public typealias MultipleDoneAction = (textField: UITextField, selectedIndexs: [Int], selectedValues: [String]) -> Void - public typealias DateDoneAction = (textField: UITextField, selectedDate: NSDate) -> Void + public typealias SingleDoneAction = (_ textField: UITextField, _ selectedIndex: Int, _ selectedValue: String) -> Void + public typealias MultipleDoneAction = (_ textField: UITextField, _ selectedIndexs: [Int], _ selectedValues: [String]) -> Void + public typealias DateDoneAction = (_ textField: UITextField, _ selectedDate: Date) -> Void public typealias MultipleAssociatedDataType = [[[String: [String]?]]] /// 保存pickerView的初始化 - private var setUpPickerClosure:(() -> PickerView)? + fileprivate var setUpPickerClosure:(() -> PickerView)? /// 如果设置了autoSetSelectedText为true 将自动设置text的值, 默认以空格分开多列选择, 但你仍然可以在响应完成的closure中修改text的值 - private var autoSetSelectedText = false + fileprivate var autoSetSelectedText = false //MARK: 初始化 override public init(frame: CGRect) { @@ -57,7 +57,7 @@ public class SelectionTextField: UITextField { } deinit { - NSNotificationCenter.defaultCenter().removeObserver(self) + NotificationCenter.default.removeObserver(self) print("\(self.debugDescription) --- 销毁") } @@ -67,23 +67,23 @@ public class SelectionTextField: UITextField { // MARK: - 监听通知 extension SelectionTextField { - private func commonInit() { - NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.didBeginEdit), name: UITextFieldTextDidBeginEditingNotification, object: self) - NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.didEndEdit), name: UITextFieldTextDidEndEditingNotification, object: self) + fileprivate func commonInit() { + NotificationCenter.default.addObserver(self, selector: #selector(didBeginEdit), name: UITextField.textDidEndEditingNotification, object: self) + NotificationCenter.default.addObserver(self, selector: #selector(didEndEdit), name: UITextField.textDidEndEditingNotification, object: self) } // 开始编辑添加pickerView - func didBeginEdit() { + @objc func didBeginEdit() { let pickerView = setUpPickerClosure?() pickerView?.delegate = self inputView = pickerView } // 编辑完成销毁pickerView - func didEndEdit() { + @objc func didEndEdit() { inputView = nil } - override public func caretRectForPosition(position: UITextPosition) -> CGRect { - return CGRectZero + override open func caretRect(for position: UITextPosition) -> CGRect { + return CGRect.zero } } @@ -100,7 +100,7 @@ extension SelectionTextField { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public func showSingleColPicker(toolBarTitle: String, data: [String], defaultSelectedIndex: Int?,autoSetSelectedText: Bool, doneAction: SingleDoneAction?) { + public func showSingleColPicker(_ toolBarTitle: String, data: [String], defaultSelectedIndex: Int?,autoSetSelectedText: Bool, doneAction: SingleDoneAction?) { self.autoSetSelectedText = autoSetSelectedText @@ -113,7 +113,7 @@ extension SelectionTextField { }, doneAction: {[unowned self] (selectedIndex: Int, selectedValue: String) -> Void in - doneAction?(textField:self, selectedIndex: selectedIndex, selectedValue: selectedValue) + doneAction?(self, selectedIndex, selectedValue) self.endEditing(true) }) @@ -132,7 +132,7 @@ extension SelectionTextField { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public func showMultipleColsPicker(toolBarTitle: String, data: [[String]], defaultSelectedIndexs: [Int]?, autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { + public func showMultipleColsPicker(_ toolBarTitle: String, data: [[String]], defaultSelectedIndexs: [Int]?, autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { self.autoSetSelectedText = autoSetSelectedText setUpPickerClosure = {() -> PickerView in @@ -143,7 +143,7 @@ extension SelectionTextField { }, doneAction:{[unowned self] (selectedIndexs: [Int], selectedValues: [String]) -> Void in - doneAction?(textField:self, selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(self, selectedIndexs, selectedValues) self.endEditing(true) }) } @@ -159,7 +159,7 @@ extension SelectionTextField { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public func showMultipleAssociatedColsPicker(toolBarTitle: String, data: MultipleAssociatedDataType, defaultSelectedValues: [String]?,autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { + public func showMultipleAssociatedColsPicker(_ toolBarTitle: String, data: MultipleAssociatedDataType, defaultSelectedValues: [String]?,autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { self.autoSetSelectedText = autoSetSelectedText setUpPickerClosure = {() -> PickerView in @@ -170,7 +170,7 @@ extension SelectionTextField { }, doneAction:{[unowned self] (selectedIndexs: [Int], selectedValues: [String]) -> Void in - doneAction?(textField:self, selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(self, selectedIndexs, selectedValues) self.endEditing(true) }) } @@ -187,7 +187,7 @@ extension SelectionTextField { /// /// - returns: - public func showCitiesPicker(toolBarTitle: String, defaultSelectedValues: [String]?,autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { + public func showCitiesPicker(_ toolBarTitle: String, defaultSelectedValues: [String]?,autoSetSelectedText: Bool, doneAction: MultipleDoneAction?) { self.autoSetSelectedText = autoSetSelectedText setUpPickerClosure = {() -> PickerView in @@ -196,7 +196,7 @@ extension SelectionTextField { }, doneAction:{[unowned self] (selectedIndexs: [Int], selectedValues: [String]) -> Void in - doneAction?(textField:self,selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(self,selectedIndexs, selectedValues) self.endEditing(true) }) } @@ -211,7 +211,7 @@ extension SelectionTextField { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public func showDatePicker(toolBarTitle: String, datePickerSetting: DatePickerSetting = DatePickerSetting(), autoSetSelectedText: Bool, doneAction: DateDoneAction?) { + public func showDatePicker(_ toolBarTitle: String, datePickerSetting: DatePickerSetting = DatePickerSetting(), autoSetSelectedText: Bool, doneAction: DateDoneAction?) { self.autoSetSelectedText = autoSetSelectedText setUpPickerClosure = {() -> PickerView in @@ -219,7 +219,7 @@ extension SelectionTextField { self.endEditing(true) }, doneAction: {[unowned self] (selectedDate) in - doneAction?(textField:self, selectedDate: selectedDate) + doneAction?(self, selectedDate) self.endEditing(true) }) @@ -232,28 +232,28 @@ extension SelectionTextField { // MARK: - PickerViewDelegate -- 如果设置了autoSetSelectedText为true 这些代理方法中将以默认的格式自动设置textField的值 extension SelectionTextField: PickerViewDelegate { - public func singleColDidSelecte(selectedIndex: Int, selectedValue: String) { + public func singleColDidSelecte(_ selectedIndex: Int, selectedValue: String) { if autoSetSelectedText { text = " " + selectedValue } } - public func multipleColsDidSelecte(selectedIndexs: [Int], selectedValues: [String]) { + public func multipleColsDidSelecte(_ selectedIndexs: [Int], selectedValues: [String]) { if autoSetSelectedText { - text = selectedValues.reduce("", combine: { (result, selectedValue) -> String in + text = selectedValues.reduce("", { (result, selectedValue) -> String in result + " " + selectedValue }) } } - public func dateDidSelecte(selectedDate: NSDate) { + public func dateDidSelecte(_ selectedDate: Date) { if autoSetSelectedText { - let formatter = NSDateFormatter() + let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" - let string = formatter.stringFromDate(selectedDate) + let string = formatter.string(from: selectedDate) text = " " + string } } diff --git a/Source/ToolBarView.swift b/Source/ToolBarView.swift index f987cdc..4b97882 100755 --- a/Source/ToolBarView.swift +++ b/Source/ToolBarView.swift @@ -30,46 +30,46 @@ import UIKit -public class ToolBarView: UIView { +open class ToolBarView: UIView { - typealias CustomClosures = (titleLabel: UILabel, cancleBtn: UIButton, doneBtn: UIButton) -> Void + typealias CustomClosures = (_ titleLabel: UILabel, _ cancleBtn: UIButton, _ doneBtn: UIButton) -> Void public typealias BtnAction = () -> Void - public var title = "请选择" { + open var title = "请选择" { didSet { titleLabel.text = title } } - public var doneAction: BtnAction? - public var cancelAction: BtnAction? + open var doneAction: BtnAction? + open var cancelAction: BtnAction? // 用来产生上下分割线的效果 - private lazy var contentView: UIView = { + fileprivate lazy var contentView: UIView = { let content = UIView() - content.backgroundColor = UIColor.whiteColor() + content.backgroundColor = UIColor.white return content }() // 文本框 - private lazy var titleLabel: UILabel = { + fileprivate lazy var titleLabel: UILabel = { let label = UILabel() - label.textColor = UIColor.blackColor() - label.textAlignment = .Center + label.textColor = UIColor.black + label.textAlignment = .center return label }() // 取消按钮 - private lazy var cancleBtn: UIButton = { + fileprivate lazy var cancleBtn: UIButton = { let btn = UIButton() - btn.setTitle("取消", forState: .Normal) - btn.setTitleColor(UIColor.blackColor(), forState: .Normal) + btn.setTitle("取消", for: .normal) + btn.setTitleColor(UIColor.black, for: .normal) return btn }() // 完成按钮 - private lazy var doneBtn: UIButton = { + fileprivate lazy var doneBtn: UIButton = { let donebtn = UIButton() - donebtn.setTitle("完成", forState: .Normal) - donebtn.setTitleColor(UIColor.blackColor(), forState: .Normal) + donebtn.setTitle("完成", for: .normal) + donebtn.setTitleColor(UIColor.black, for: .normal) return donebtn }() @@ -83,26 +83,26 @@ public class ToolBarView: UIView { fatalError("init(coder:) has not been implemented") } - private func commonInit() { - backgroundColor = UIColor.lightTextColor() + fileprivate func commonInit() { + backgroundColor = UIColor.lightText addSubview(contentView) contentView.addSubview(cancleBtn) contentView.addSubview(doneBtn) contentView.addSubview(titleLabel) - doneBtn.addTarget(self, action: #selector(self.doneBtnOnClick(_:)), forControlEvents: .TouchUpInside) - cancleBtn.addTarget(self, action: #selector(self.cancelBtnOnClick(_:)), forControlEvents: .TouchUpInside) + doneBtn.addTarget(self, action: #selector(doneBtnOnClick(_:)), for: .touchUpInside) + cancleBtn.addTarget(self, action: #selector(cancelBtnOnClick(_:)), for: .touchUpInside) } - func doneBtnOnClick(sender: UIButton) { + @objc func doneBtnOnClick(_ sender: UIButton) { doneAction?() } - func cancelBtnOnClick(sender: UIButton) { + @objc func cancelBtnOnClick(_ sender: UIButton) { cancelAction?() } - override public func layoutSubviews() { + override open func layoutSubviews() { super.layoutSubviews() let margin = 15.0 let contentHeight = Double(bounds.size.height) - 2.0 @@ -111,7 +111,7 @@ public class ToolBarView: UIView { cancleBtn.frame = CGRect(x: margin, y: 0.0, width: btnWidth, height: btnWidth) doneBtn.frame = CGRect(x: Double(bounds.size.width) - btnWidth - margin, y: 0.0, width: btnWidth, height: btnWidth) - let titleX = Double(CGRectGetMaxX(cancleBtn.frame)) + margin + let titleX = Double(cancleBtn.frame.maxX) + margin let titleW = Double(bounds.size.width) - titleX - btnWidth - margin diff --git a/Source/UsefulPickerView.swift b/Source/UsefulPickerView.swift index 378c8f4..af7dc71 100755 --- a/Source/UsefulPickerView.swift +++ b/Source/UsefulPickerView.swift @@ -30,25 +30,25 @@ import UIKit -public class UsefulPickerView: UIView { +open class UsefulPickerView: UIView { public typealias BtnAction = () -> Void - public typealias SingleDoneAction = (selectedIndex: Int, selectedValue: String) -> Void - public typealias MultipleDoneAction = (selectedIndexs: [Int], selectedValues: [String]) -> Void - public typealias DateDoneAction = (selectedDate: NSDate) -> Void + public typealias SingleDoneAction = (_ selectedIndex: Int, _ selectedValue: String) -> Void + public typealias MultipleDoneAction = (_ selectedIndexs: [Int], _ selectedValues: [String]) -> Void + public typealias DateDoneAction = (_ selectedDate: Date) -> Void public typealias MultipleAssociatedDataType = [[[String: [String]?]]] - private var pickerView: PickerView! + fileprivate var pickerView: PickerView! //MARK:- 常量 - private let pickerViewHeight:CGFloat = 260.0 + fileprivate let pickerViewHeight:CGFloat = 260.0 - private let screenWidth = UIScreen.mainScreen().bounds.size.width - private let screenHeight = UIScreen.mainScreen().bounds.size.height - private var hideFrame: CGRect { + fileprivate let screenWidth = UIScreen.main.bounds.size.width + fileprivate let screenHeight = UIScreen.main.bounds.size.height + fileprivate var hideFrame: CGRect { return CGRect(x: 0.0, y: screenHeight, width: screenWidth, height: pickerViewHeight) } - private var showFrame: CGRect { + fileprivate var showFrame: CGRect { return CGRect(x: 0.0, y: screenHeight - pickerViewHeight, width: screenWidth, height: pickerViewHeight) } @@ -68,7 +68,7 @@ public class UsefulPickerView: UIView { self.hidePicker() }, doneAction: {[unowned self] (selectedIndex, selectedValue) in - doneAction?(selectedIndex: selectedIndex, selectedValue: selectedValue) + doneAction?(selectedIndex, selectedValue) self.hidePicker() }) @@ -90,7 +90,7 @@ public class UsefulPickerView: UIView { self.hidePicker() }, doneAction: {[unowned self] (selectedIndexs, selectedValues) in - doneAction?(selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(selectedIndexs, selectedValues) self.hidePicker() }) pickerView.frame = hideFrame @@ -111,7 +111,7 @@ public class UsefulPickerView: UIView { self.hidePicker() }, doneAction: {[unowned self] (selectedIndexs, selectedValues) in - doneAction?(selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(selectedIndexs, selectedValues) self.hidePicker() }) @@ -124,7 +124,7 @@ public class UsefulPickerView: UIView { } // 城市选择器 - convenience init(frame: CGRect, toolBarTitle: String, defaultSelectedValues: [String]?, doneAction: MultipleDoneAction?) { + convenience init(frame: CGRect, toolBarTitle: String, defaultSelectedValues: [String]?, doneAction: MultipleDoneAction?, selectTopLevel: Bool = false) { self.init(frame: frame) @@ -133,9 +133,9 @@ public class UsefulPickerView: UIView { self.hidePicker() }, doneAction: {[unowned self] (selectedIndexs, selectedValues) in - doneAction?(selectedIndexs: selectedIndexs, selectedValues: selectedValues) + doneAction?(selectedIndexs, selectedValues) self.hidePicker() - }) + }, selectTopLevel: selectTopLevel) pickerView.frame = hideFrame addSubview(pickerView) @@ -155,7 +155,7 @@ public class UsefulPickerView: UIView { self.hidePicker() }, doneAction: {[unowned self] (selectedDate) in - doneAction?(selectedDate: selectedDate) + doneAction?(selectedDate) self.hidePicker() }) @@ -179,7 +179,7 @@ public class UsefulPickerView: UIView { } deinit { - NSNotificationCenter.defaultCenter().removeObserver(self) + NotificationCenter.default.removeObserver(self) print("\(self.debugDescription) --- 销毁") } @@ -188,17 +188,16 @@ public class UsefulPickerView: UIView { // MARK:- selector extension UsefulPickerView { - - private func addOrentationObserver() { - NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.statusBarOrientationChange), name: UIApplicationDidChangeStatusBarOrientationNotification, object: nil) + fileprivate func addOrentationObserver() { + NotificationCenter.default.addObserver(self, selector: #selector(self.statusBarOrientationChange), name: UIApplication.didChangeStatusBarOrientationNotification, object: nil) } // 屏幕旋转时移除pickerView - func statusBarOrientationChange() { + @objc func statusBarOrientationChange() { removeFromSuperview() } - func tapAction(tap: UITapGestureRecognizer) { - let location = tap.locationInView(self) + @objc func tapAction(_ tap: UITapGestureRecognizer) { + let location = tap.location(in: self) // 点击空白背景移除self if location.y <= screenHeight - pickerViewHeight { self.hidePicker() @@ -209,9 +208,9 @@ extension UsefulPickerView { // MARK:- 弹出和移除self extension UsefulPickerView { - private func showPicker() { + fileprivate func showPicker() { // 通过window 弹出view - let window = UIApplication.sharedApplication().keyWindow + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } currentWindow.addSubview(self) @@ -224,7 +223,7 @@ extension UsefulPickerView { // // currentWindow.addConstraints([pickerX, pickerY, pickerW, pickerH]) - UIView.animateWithDuration(0.25, animations: {[unowned self] in + UIView.animate(withDuration: 0.25, animations: {[unowned self] in self.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.1) self.pickerView.frame = self.showFrame }, completion: nil) @@ -234,13 +233,13 @@ extension UsefulPickerView { func hidePicker() { // 把self从window中移除 - UIView.animateWithDuration(0.25, animations: { [unowned self] in - self.backgroundColor = UIColor.clearColor() + UIView.animate(withDuration: 0.25, animations: { [unowned self] in + self.backgroundColor = UIColor.clear self.pickerView.frame = self.hideFrame - }) {[unowned self] (_) in + }, completion: {[unowned self] (_) in self.removeFromSuperview() - } + }) } } @@ -255,8 +254,8 @@ extension UsefulPickerView { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public class func showSingleColPicker(toolBarTitle: String, data: [String], defaultSelectedIndex: Int?, doneAction: SingleDoneAction?) { - let window = UIApplication.sharedApplication().keyWindow + public class func showSingleColPicker(_ toolBarTitle: String, data: [String], defaultSelectedIndex: Int?, doneAction: SingleDoneAction?) { + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, singleColData: data,defaultSelectedIndex: defaultSelectedIndex ,doneAction: doneAction) @@ -273,8 +272,8 @@ extension UsefulPickerView { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public class func showMultipleColsPicker(toolBarTitle: String, data: [[String]], defaultSelectedIndexs: [Int]?,doneAction: MultipleDoneAction?) { - let window = UIApplication.sharedApplication().keyWindow + public class func showMultipleColsPicker(_ toolBarTitle: String, data: [[String]], defaultSelectedIndexs: [Int]?,doneAction: MultipleDoneAction?) { + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, multipleColsData: data, defaultSelectedIndexs: defaultSelectedIndexs, doneAction: doneAction) @@ -291,8 +290,8 @@ extension UsefulPickerView { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public class func showMultipleAssociatedColsPicker(toolBarTitle: String, data: MultipleAssociatedDataType, defaultSelectedValues: [String]?, doneAction: MultipleDoneAction?) { - let window = UIApplication.sharedApplication().keyWindow + public class func showMultipleAssociatedColsPicker(_ toolBarTitle: String, data: MultipleAssociatedDataType, defaultSelectedValues: [String]?, doneAction: MultipleDoneAction?) { + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, multipleAssociatedColsData: data, defaultSelectedValues: defaultSelectedValues, doneAction: doneAction) @@ -309,13 +308,13 @@ extension UsefulPickerView { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public class func showCitiesPicker(toolBarTitle: String, defaultSelectedValues: [String]?, doneAction: MultipleDoneAction?) { + public class func showCitiesPicker(_ toolBarTitle: String, defaultSelectedValues: [String]?, selectTopLevel: Bool=false, doneAction: MultipleDoneAction?) { - let window = UIApplication.sharedApplication().keyWindow + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } - let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, defaultSelectedValues: defaultSelectedValues, doneAction: doneAction) - + let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, defaultSelectedValues: defaultSelectedValues, doneAction: doneAction, selectTopLevel: selectTopLevel) + testView.showPicker() } @@ -327,9 +326,9 @@ extension UsefulPickerView { /// - parameter doneAction: 响应完成的Closure /// /// - returns: - public class func showDatePicker(toolBarTitle: String, datePickerSetting: DatePickerSetting = DatePickerSetting(), doneAction: DateDoneAction?) { + public class func showDatePicker(_ toolBarTitle: String, datePickerSetting: DatePickerSetting = DatePickerSetting(), doneAction: DateDoneAction?) { - let window = UIApplication.sharedApplication().keyWindow + let window = UIApplication.shared.keyWindow guard let currentWindow = window else { return } let testView = UsefulPickerView(frame: currentWindow.bounds, toolBarTitle: toolBarTitle, datePickerSetting: datePickerSetting, doneAction: doneAction) From 57c7fbe749914b4a688f32f7c226e734030b1981 Mon Sep 17 00:00:00 2001 From: isandboy Date: Thu, 14 Nov 2019 14:32:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=B5=84=E6=BA=90=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=94=BE=E5=88=B0bundle=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 10244 bytes Source/Picker.swift | 1 + Source/PickerView.swift | 9 +++++---- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ UsefulPickerView.podspec | 7 +++++-- 5 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 .DS_Store create mode 100644 UsefulPickerVIew.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e9e1e1f7b181b5d96650ee337e0900fbc79cb197 GIT binary patch literal 10244 zcmeHMU2GIZ9RL5XrQKZ$-6GfnDI636LV*@)D zYW*PkKoHR=#+VrNMT?0s(Ff&4qY)!9F_4Hp@M4q)Uoi0E6aHssuk2na=K)4EyUEUf zcK#nT^PAu7%DfK*3OFSzNFw=zzOSYuX2g@@Ed2r> z0UrS$0UrS$0Uv>T1p!*K*(FTo(ocN^d<1+1#t>ldhY;ONh8;P=rTyxl#6AL$ETm%l zqP)y9Btwo2J930e($Iz6l_YmX=ZJyaoytRwUD%N$Tyl3n=kS3}&FGv^(5{{0hir4e zFqeMnBj6)29szcCFNEc=4>Yhm=l8;zuid)1(cB!>jVP4~SDVjVyEObogIBNIQlH%K z`ZiE>oLr$8THp{wAPz~;L2cEIm{S9r#B1qZeBHj7akjN$#`LIR=r>V$x&hzM8}IDy zOr+$%>&=$knXCrIjT>E>*viu}4Dt4ChE`~z?rnt*Xvyl>`()zom@prCM4QL!LMf;2^XqGP`? z&|yWawAmO*?P5>u5o>?c$#)XuWBEw5TT=)6Z(GutLlfVLPPcS)hu5(JS+<33u_)}-4h=?JoMD?(?`=fT5G43EM?ivqly?WmjmO&pxSUZY1sfR3< z+i4mptI0O((a4vT^~rMDRJW<*p!KWGkofz*+bX&cP4xGyDR-!f$XHuD~B~6|Nzogp;uZgE$Z8 z;{sfWOK=s|Vjb4wI&8u9xDi{i4SR40?!sPFFpdd4h$$Sx7w`zah%ezA_zr%6qj(xW z#82^a{E9a%kYV#C{+vmXy>h*zHT#_z8`ym_QdYFA-|#Py@~0BU#IkAkO`kERa?#T2 zht@ncHi%i{=Ao9GPd0@(M{Mq7xWPF~e4RP#0jZ*kSfw7y=6QzyaxvqNaDiFR4OLXg zj5z#JTu>nqvqf9Ccme4Gj;3lEX$pwMTvxMFs*ooUU%6jhy(GznL};#EyNY(Yv&S$8bdYDcDRwf{U|pNx(93gz z|NnQnRzIANfRDhvga8&ccQiLri!!Iu?8XJCAVl{by4l6-M!2+HC}Ae7-2NO-5A1Wi reJZCi=R9uf!;akum$p0k+3qCy*ZhC}XMlhHzw?h${`vpEeE$CniGPef literal 0 HcmV?d00001 diff --git a/Source/Picker.swift b/Source/Picker.swift index 6975191..df4bdf7 100755 --- a/Source/Picker.swift +++ b/Source/Picker.swift @@ -473,6 +473,7 @@ extension Picker { /// 城市选择器 class func citiesPicker(_ defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?) -> Picker { + let provincePath = Bundle.main.path(forResource: "Province", ofType: "plist") let cityPath = Bundle.main.path(forResource: "City", ofType: "plist") let areaPath = Bundle.main.path(forResource: "Area", ofType: "plist") diff --git a/Source/PickerView.swift b/Source/PickerView.swift index 693dcda..48d565f 100755 --- a/Source/PickerView.swift +++ b/Source/PickerView.swift @@ -591,10 +591,11 @@ extension PickerView { /// 城市选择器 public class func citiesPicker(_ toolBarTitle: String, defaultSelectedValues: [String]?, cancelAction: BtnAction?, doneAction: MultipleDoneAction?, selectTopLevel:Bool = false) -> PickerView { - - let provincePath = Bundle.main.path(forResource: "Province", ofType: "plist") - let cityPath = Bundle.main.path(forResource: "City", ofType: "plist") - let areaPath = Bundle.main.path(forResource: "Area", ofType: "plist") + + let bundleUrl = Bundle(for: self).url(forResource: "UsefulPickerView", withExtension: "bundle") + let provincePath = Bundle(url: bundleUrl!)?.path(forResource: "Province", ofType: "plist") + let cityPath = Bundle(url: bundleUrl!)?.path(forResource: "City", ofType: "plist") + let areaPath = Bundle(url: bundleUrl!)?.path(forResource: "Area", ofType: "plist") // 这里需要使用数组, 因为字典无序, 如果只使用 cityArr,areaArr, 那么显示将是无序的, 不能按照plist中的数组显示 let proviceArr = NSArray(contentsOfFile: provincePath!) let cityArr = NSDictionary(contentsOfFile: cityPath!) diff --git a/UsefulPickerVIew.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/UsefulPickerVIew.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/UsefulPickerVIew.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/UsefulPickerView.podspec b/UsefulPickerView.podspec index 222d871..7fa7c1c 100755 --- a/UsefulPickerView.podspec +++ b/UsefulPickerView.podspec @@ -11,5 +11,8 @@ Pod::Spec.new do |s| s.platform = :ios, "8.0" s.source = { :git => "https://github.com/jasnig/UsefulPickerView.git", :tag => s.version } s.framework = "UIKit" - s.source_files = "Source/*.swift","Source/*.plist" -end \ No newline at end of file + s.source_files = "Source/*.swift" + s.resource_bundles = { + 'UsefulPickerView' => ["Source/*.plist"] + } +end