Swift 中 UITextView 和 UITextField 的单一扩展
Single extension for UITextView and UITextField in Swift
我想为 UITextField
和 UITextView
创建一个 扩展 并向其添加以下方法:
func addDoneButtonOnKeyboardWith(selector : Selector)
{
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
self.inputAccessoryView = keyBoardToolBar
self.reloadInputViews()
}
我希望扩展方法仅适用于 UITextField
和 UITextView
。
也许这会奏效,因为 UIView
是它们的父级 class,缺点是这可能会出现在各种视图中,不确定是否有其他方法可以实现您的目标需要:
extension UIView {
func addDoneButtonOnKeyboardWith(selector : Selector)
{
if self is UITextField || self is UITextView {
//do something
}
}
}
最接近的 class,您可以扩展的是 UIControl,您可以扩展它,但是 UIButtons 和其他控件将再次访问此方法。
因此您可以使用静态方法扩展或子class 例如 UIBarButtonItem。
class func addDoneBarButtonOnKeyboardFor(keyInput: UIControl <UIKeyInput>, usingSelector : Selector)
{
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
keyInput.inputAccessoryView = keyBoardToolBar
keyInput.reloadInputViews()
}
抱歉,如果在 Swift 代码中出现错误。现在在 Obj C 上开发。
我有一个想法可以做你想做的事,利用协议的默认实现。 技术上您仍然需要两个扩展,但它们都将完全是空的。考虑以下因素:
为您的方法创建协议,并提供默认实现:
protocol DoneButtonBearer {
func addDoneButtonOnKeyboardWith(selector: Selector)
}
extension DoneButtonBearer {
func addDoneButtonOnKeyboardWith(selector: Selector) {
var view: UIView?
defer {
if view != nil {
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
view!.inputAccessoryView = keyBoardToolBar
view!.reloadInputViews()
}
}
if let textField = self as? UITextField {
view = textField
return
}
if let textView = self as? UITextView {
view = textView
return
}
}
}
然后只需使用此功能扩展 UITextField
和 UITextView
:
extension UITextField: DoneButtonBearer { }
extension UITextView: DoneButtonBearer { }
我想为 UITextField
和 UITextView
创建一个 扩展 并向其添加以下方法:
func addDoneButtonOnKeyboardWith(selector : Selector)
{
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
self.inputAccessoryView = keyBoardToolBar
self.reloadInputViews()
}
我希望扩展方法仅适用于 UITextField
和 UITextView
。
也许这会奏效,因为 UIView
是它们的父级 class,缺点是这可能会出现在各种视图中,不确定是否有其他方法可以实现您的目标需要:
extension UIView {
func addDoneButtonOnKeyboardWith(selector : Selector)
{
if self is UITextField || self is UITextView {
//do something
}
}
}
最接近的 class,您可以扩展的是 UIControl,您可以扩展它,但是 UIButtons 和其他控件将再次访问此方法。
因此您可以使用静态方法扩展或子class 例如 UIBarButtonItem。
class func addDoneBarButtonOnKeyboardFor(keyInput: UIControl <UIKeyInput>, usingSelector : Selector)
{
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
keyInput.inputAccessoryView = keyBoardToolBar
keyInput.reloadInputViews()
}
抱歉,如果在 Swift 代码中出现错误。现在在 Obj C 上开发。
我有一个想法可以做你想做的事,利用协议的默认实现。 技术上您仍然需要两个扩展,但它们都将完全是空的。考虑以下因素:
为您的方法创建协议,并提供默认实现:
protocol DoneButtonBearer {
func addDoneButtonOnKeyboardWith(selector: Selector)
}
extension DoneButtonBearer {
func addDoneButtonOnKeyboardWith(selector: Selector) {
var view: UIView?
defer {
if view != nil {
let keyBoardToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 30))
let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: selector)
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
keyBoardToolBar.items = [flexibleSpace, barButtonItem]
keyBoardToolBar.barStyle = .default
view!.inputAccessoryView = keyBoardToolBar
view!.reloadInputViews()
}
}
if let textField = self as? UITextField {
view = textField
return
}
if let textView = self as? UITextView {
view = textView
return
}
}
}
然后只需使用此功能扩展 UITextField
和 UITextView
:
extension UITextField: DoneButtonBearer { }
extension UITextView: DoneButtonBearer { }