diff --git a/Sources/PostalAddressCell.swift b/Sources/PostalAddressCell.swift index 4e23228..232350f 100644 --- a/Sources/PostalAddressCell.swift +++ b/Sources/PostalAddressCell.swift @@ -15,7 +15,9 @@ import Eureka * Protocol for cells that contain a postal address */ public protocol PostalAddressCellConformance { - var streetTextField: UITextField? { get } + var street1TextField: UITextField? { get } + var street2TextField: UITextField? { get } + var poboxTextField: UITextField? { get } var stateTextField: UITextField? { get } var postalCodeTextField: UITextField? { get } var cityTextField: UITextField? { get } @@ -25,7 +27,9 @@ public protocol PostalAddressCellConformance { /// Base class that implements the cell logic for the PostalAddressRow open class _PostalAddressCell: Cell, CellType, PostalAddressCellConformance, UITextFieldDelegate { - @IBOutlet open var streetTextField: UITextField? + @IBOutlet open var street1TextField: UITextField? + @IBOutlet open var street2TextField: UITextField? + @IBOutlet open var poboxTextField: UITextField? @IBOutlet open var firstSeparatorView: UIView? @IBOutlet open var stateTextField: UITextField? @IBOutlet open var postalCodeTextField: UITextField? @@ -47,12 +51,16 @@ open class _PostalAddressCell: Cell, CellType, PostalAd open override func awakeFromNib() { super.awakeFromNib() - textFieldOrdering = [streetTextField, postalCodeTextField, cityTextField, stateTextField, countryTextField] + textFieldOrdering = [street1TextField, street2TextField, poboxTextField, postalCodeTextField, cityTextField, stateTextField, countryTextField] } deinit { - streetTextField?.delegate = nil - streetTextField?.removeTarget(self, action: nil, for: .allEvents) + street1TextField?.delegate = nil + street1TextField?.removeTarget(self, action: nil, for: .allEvents) + street2TextField?.delegate = nil + street2TextField?.removeTarget(self, action: nil, for: .allEvents) + poboxTextField?.delegate = nil + poboxTextField?.removeTarget(self, action: nil, for: .allEvents) stateTextField?.delegate = nil stateTextField?.removeTarget(self, action: nil, for: .allEvents) postalCodeTextField?.delegate = nil @@ -97,8 +105,14 @@ open class _PostalAddressCell: Cell, CellType, PostalAd textField?.autocapitalizationType = .words } - streetTextField?.text = row.value?.street - streetTextField?.keyboardType = .asciiCapable + street1TextField?.text = row.value?.street1 + street1TextField?.keyboardType = .asciiCapable + + street2TextField?.text = row.value?.street2 + street2TextField?.keyboardType = .asciiCapable + + poboxTextField?.text = row.value?.pobox + poboxTextField?.keyboardType = .asciiCapable stateTextField?.text = row.value?.state stateTextField?.keyboardType = .asciiCapable @@ -113,7 +127,9 @@ open class _PostalAddressCell: Cell, CellType, PostalAd countryTextField?.keyboardType = .asciiCapable if let rowConformance = row as? PostalAddressRowConformance { - setPlaceholderToTextField(textField: streetTextField, placeholder: rowConformance.streetPlaceholder) + setPlaceholderToTextField(textField: street1TextField, placeholder: rowConformance.street1Placeholder) + setPlaceholderToTextField(textField: street2TextField, placeholder: rowConformance.street2Placeholder) + setPlaceholderToTextField(textField: poboxTextField, placeholder: rowConformance.poboxPlaceholder) setPlaceholderToTextField(textField: stateTextField, placeholder: rowConformance.statePlaceholder) setPlaceholderToTextField(textField: postalCodeTextField, placeholder: rowConformance.postalCodePlaceholder) setPlaceholderToTextField(textField: cityTextField, placeholder: rowConformance.cityPlaceholder) @@ -133,7 +149,9 @@ open class _PostalAddressCell: Cell, CellType, PostalAd open override func cellCanBecomeFirstResponder() -> Bool { return !row.isDisabled && ( - streetTextField?.canBecomeFirstResponder == true || + street1TextField?.canBecomeFirstResponder == true || + street2TextField?.canBecomeFirstResponder == true || + poboxTextField?.canBecomeFirstResponder == true || stateTextField?.canBecomeFirstResponder == true || postalCodeTextField?.canBecomeFirstResponder == true || cityTextField?.canBecomeFirstResponder == true || @@ -146,7 +164,9 @@ open class _PostalAddressCell: Cell, CellType, PostalAd } open override func cellResignFirstResponder() -> Bool { - return streetTextField?.resignFirstResponder() ?? true + return street1TextField?.resignFirstResponder() ?? true + && street2TextField?.resignFirstResponder() ?? true + && poboxTextField?.resignFirstResponder() ?? true && stateTextField?.resignFirstResponder() ?? true && postalCodeTextField?.resignFirstResponder() ?? true && stateTextField?.resignFirstResponder() ?? true @@ -210,8 +230,14 @@ open class _PostalAddressCell: Cell, CellType, PostalAd guard let textValue = textField.text else { switch(textField){ - case let field where field == streetTextField: - row.value?.street = nil + case let field where field == street1TextField: + row.value?.street1 = nil + + case let field where field == street2TextField: + row.value?.street2 = nil + + case let field where field == poboxTextField: + row.value?.pobox = nil case let field where field == stateTextField: row.value?.state = nil @@ -235,9 +261,17 @@ open class _PostalAddressCell: Cell, CellType, PostalAd var valueFormatter: Formatter? switch(textField){ - case let field where field == streetTextField: - useFormatterDuringInput = rowConformance.streetUseFormatterDuringInput - valueFormatter = rowConformance.streetFormatter + case let field where field == street1TextField: + useFormatterDuringInput = rowConformance.street1UseFormatterDuringInput + valueFormatter = rowConformance.street1Formatter + + case let field where field == street2TextField: + useFormatterDuringInput = rowConformance.street2UseFormatterDuringInput + valueFormatter = rowConformance.street2Formatter + + case let field where field == poboxTextField: + useFormatterDuringInput = rowConformance.poboxUseFormatterDuringInput + valueFormatter = rowConformance.poboxFormatter case let field where field == stateTextField: useFormatterDuringInput = rowConformance.stateUseFormatterDuringInput @@ -265,8 +299,12 @@ open class _PostalAddressCell: Cell, CellType, PostalAd if formatter.getObjectValue(value, for: textValue, errorDescription: errorDesc) { switch(textField){ - case let field where field == streetTextField: - row.value?.street = value.pointee as? String + case let field where field == street1TextField: + row.value?.street1 = value.pointee as? String + case let field where field == street2TextField: + row.value?.street2 = value.pointee as? String + case let field where field == poboxTextField: + row.value?.pobox = value.pointee as? String case let field where field == stateTextField: row.value?.state = value.pointee as? String case let field where field == postalCodeTextField: @@ -294,8 +332,12 @@ open class _PostalAddressCell: Cell, CellType, PostalAd guard !textValue.isEmpty else { switch(textField){ - case let field where field == streetTextField: - row.value?.street = nil + case let field where field == street1TextField: + row.value?.street1 = nil + case let field where field == street2TextField: + row.value?.street2 = nil + case let field where field == poboxTextField: + row.value?.pobox = nil case let field where field == stateTextField: row.value?.state = nil case let field where field == postalCodeTextField: @@ -311,8 +353,12 @@ open class _PostalAddressCell: Cell, CellType, PostalAd } switch(textField){ - case let field where field == streetTextField: - row.value?.street = textValue + case let field where field == street1TextField: + row.value?.street1 = textValue + case let field where field == street2TextField: + row.value?.street2 = textValue + case let field where field == poboxTextField: + row.value?.pobox = textValue case let field where field == stateTextField: row.value?.state = textValue case let field where field == postalCodeTextField: diff --git a/Sources/PostalAddressCell.xib b/Sources/PostalAddressCell.xib index 55fdc95..7384537 100644 --- a/Sources/PostalAddressCell.xib +++ b/Sources/PostalAddressCell.xib @@ -22,6 +22,16 @@ + + + + + + + + + + @@ -56,30 +66,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -93,7 +131,9 @@ - + + + diff --git a/Sources/PostalAddressRow.swift b/Sources/PostalAddressRow.swift index 8d92351..ac78c64 100644 --- a/Sources/PostalAddressRow.swift +++ b/Sources/PostalAddressRow.swift @@ -15,7 +15,9 @@ import Eureka * Protocol to be implemented by PostalAddress types. */ public protocol PostalAddressType: Equatable { - var street: String? { get set } + var street1: String? { get set } + var street2: String? { get set } + var pobox: String? { get set } var state: String? { get set } var postalCode: String? { get set } var city: String? { get set } @@ -23,12 +25,14 @@ public protocol PostalAddressType: Equatable { } public func == (lhs: T, rhs: T) -> Bool { - return lhs.street == rhs.street && lhs.state == rhs.state && lhs.postalCode == rhs.postalCode && lhs.city == rhs.city && lhs.country == rhs.country + return lhs.street1 == rhs.street1 && lhs.street2 == rhs.street2 && lhs.pobox == rhs.pobox && lhs.state == rhs.state && lhs.postalCode == rhs.postalCode && lhs.city == rhs.city && lhs.country == rhs.country } /// Row type for PostalAddressRow public struct PostalAddress: PostalAddressType { - public var street: String? + public var street1: String? + public var street2: String? + public var pobox: String? public var state: String? public var postalCode: String? public var city: String? @@ -36,8 +40,10 @@ public struct PostalAddress: PostalAddressType { public init(){} - public init(street: String?, state: String?, postalCode: String?, city: String?, country: String?) { - self.street = street + public init(street1: String?, street2: String?, pobox: String?, state: String?, postalCode: String?, city: String?, country: String?) { + self.street1 = street1 + self.street2 = street2 + self.pobox = pobox self.state = state self.postalCode = postalCode self.city = city @@ -46,8 +52,14 @@ public struct PostalAddress: PostalAddressType { } public protocol PostalAddressFormatterConformance: class { - var streetUseFormatterDuringInput: Bool { get set } - var streetFormatter: Formatter? { get set } + var street1UseFormatterDuringInput: Bool { get set } + var street1Formatter: Formatter? { get set } + + var street2UseFormatterDuringInput: Bool { get set } + var street2Formatter: Formatter? { get set } + + var poboxUseFormatterDuringInput: Bool { get set } + var poboxFormatter: Formatter? { get set } var stateUseFormatterDuringInput: Bool { get set } var stateFormatter: Formatter? { get set } @@ -65,7 +77,9 @@ public protocol PostalAddressFormatterConformance: class { public protocol PostalAddressRowConformance: PostalAddressFormatterConformance { var postalAddressPercentage : CGFloat? { get set } var placeholderColor : UIColor? { get set } - var streetPlaceholder : String? { get set } + var street1Placeholder : String? { get set } + var street2Placeholder : String? { get set } + var poboxPlaceholder : String? { get set } var statePlaceholder : String? { get set } var postalCodePlaceholder : String? { get set } var cityPlaceholder : String? { get set } @@ -85,8 +99,14 @@ open class _PostalAddressRow: Row, PostalAddressRowConform /// The textColor for the textField's placeholder open var placeholderColor : UIColor? - /// The placeholder for the street textField - open var streetPlaceholder : String? + /// The placeholder for the street1 textField + open var street1Placeholder : String? + + /// The placeholder for the street 2textField + open var street2Placeholder : String? + + /// The placeholder for the pobox textField + open var poboxPlaceholder : String? /// The placeholder for the state textField open var statePlaceholder : String? @@ -100,8 +120,14 @@ open class _PostalAddressRow: Row, PostalAddressRowConform /// The placeholder for the country textField open var countryPlaceholder : String? - /// A formatter to be used to format the user's input for street - open var streetFormatter: Formatter? + /// A formatter to be used to format the user's input for street1 + open var street1Formatter: Formatter? + + /// A formatter to be used to format the user's input for street2 + open var street2Formatter: Formatter? + + /// A formatter to be used to format the user's input for pobox + open var poboxFormatter: Formatter? /// A formatter to be used to format the user's input for state open var stateFormatter: Formatter? @@ -115,8 +141,14 @@ open class _PostalAddressRow: Row, PostalAddressRowConform /// A formatter to be used to format the user's input for country open var countryFormatter: Formatter? - /// If the formatter should be used while the user is editing the street. - open var streetUseFormatterDuringInput: Bool + /// If the formatter should be used while the user is editing the street1. + open var street1UseFormatterDuringInput: Bool + + /// If the formatter should be used while the user is editing the street2. + open var street2UseFormatterDuringInput: Bool + + /// If the formatter should be used while the user is editing the street1. + open var poboxUseFormatterDuringInput: Bool /// If the formatter should be used while the user is editing the state. open var stateUseFormatterDuringInput: Bool @@ -131,7 +163,9 @@ open class _PostalAddressRow: Row, PostalAddressRowConform open var countryUseFormatterDuringInput: Bool public required init(tag: String?) { - streetUseFormatterDuringInput = false + street1UseFormatterDuringInput = false + street2UseFormatterDuringInput = false + poboxUseFormatterDuringInput = false stateUseFormatterDuringInput = false postalCodeUseFormatterDuringInput = false cityUseFormatterDuringInput = false