2015-06-22 13 views
13

Tôi đang cố gắng thêm UIToolBar tùy chỉnh vào tất cả bàn phím của tôi với ít sự lặp lại. Cách tôi hiện đang làm nó đòi hỏi tôi phải thêm mã vào tất cả các viewDidLoads của tôi và gán tất cả các ủy nhiệm của textfield cho viewController mà tôi đang sử dụng. Tôi đã thử tạo phân lớp UIToolBar của riêng mình nhưng tôi thấy rằng tôi không thể thực sự làm điều đó khi mục tiêu cho các nút "Xong" và "hủy" của tôi là chế độ xem tự. Có ai có bất cứ đề nghị cho việc tạo ra một thanh công cụ dễ dàng tái sử dụng? Cảm ơn trước.Thêm UIToolBar vào tất cả bàn phím (nhanh)

override func viewDidLoad() { 
    super.viewDidLoad() 

    var toolBar = UIToolbar() 
    toolBar.barStyle = UIBarStyle.Default 
    toolBar.translucent = true 
    toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed") 
    var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed") 
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
    toolBar.userInteractionEnabled = true 
    toolBar.sizeToFit() 

    stateField.inputAccessoryView = toolBar 
    stateField.delegate = self 
+0

Subclass 'UITextField'? Có lẽ nó cũng hoạt động với các phần mở rộng. – Glorfindel

Trả lời

45

Nhờ đề xuất của Glorfindel và mã mẫu của ncerezo tôi đã giải quyết được sự cố của mình bằng cách sử dụng tiện ích mở rộng.

extension UIViewController: UITextFieldDelegate{ 
    func addToolBar(textField: UITextField){ 
     var toolBar = UIToolbar() 
     toolBar.barStyle = UIBarStyle.Default 
     toolBar.translucent = true 
     toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
     var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed") 
     var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed") 
     var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
     toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
     toolBar.userInteractionEnabled = true 
     toolBar.sizeToFit() 

     textField.delegate = self 
     textField.inputAccessoryView = toolBar 
    } 
    func donePressed(){ 
     view.endEditing(true) 
    } 
    func cancelPressed(){ 
     view.endEditing(true) // or do something 
    } 
} 

Mặc dù tôi vẫn cần gọi mã bên dưới trên tất cả các trường văn bản của mình. Tôi cảm thấy như có thể có một cách tốt hơn mà không cần phải gọi hàm trên mỗi textField, nhưng bây giờ điều này chắc chắn là tái sử dụng nhiều hơn.

override func viewDidLoad() { 
    super.viewDidLoad() 
    addToolBar(addressField) 
} 
0

Tôi có một tiện ích mà tôi đã sử dụng một thời gian (chuyển đến từ Swift Objective-C) mà thực hiện điều này và nhiều hơn một chút, bạn có thể tìm thấy nó hữu ích:

https://github.com/ncerezo/SwiftKeyboardAccessory

Nó tạo thanh công cụ có ít nhất nút "Xong" để loại bỏ bàn phím, và các nút Tiếp theo và Trước tùy chọn. Nó cũng đảm nhiệm việc loại bỏ bàn phím khi bạn nhấn bên ngoài trường văn bản và thay đổi kích thước và cuộn chế độ xem khi bàn phím xuất hiện hoặc biến mất. Nó được thiết kế để làm việc với UITableVIew và cũng với UIScrollView.

12

tương đương với phiên bản vivian trong nhanh chóng 3:

extension UIViewController: UITextFieldDelegate { 
    func addToolBar(textField: UITextField) { 
     let toolBar = UIToolbar() 
     toolBar.barStyle = .default 
     toolBar.isTranslucent = true 
     toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
     let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(donePressed)) 
     let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed)) 
     let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 


     toolBar.isUserInteractionEnabled = true 
     toolBar.sizeToFit() 

     textField.delegate = self 
     textField.inputAccessoryView = toolBar 
    } 

    func donePressed() { 
     view.endEditing(true) 
    } 

    func cancelPressed() { 
     view.endEditing(true) // or do something 
    } 
} 
0

Bạn có thể làm một công việc lớp con UIToolbar bằng cách tận dụng các chuỗi trả lời. Không cần phải thay đổi bộ điều khiển xem của bạn. Trong Swift 3:

class KeyboardAccessoryToolbar: UIToolbar { 
    convenience init() { 
     self.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) 
     self.barStyle = .default 
     self.isTranslucent = true 
     self.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 

     let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.done)) 
     let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancel)) 
     let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     self.items = [cancelButton, spaceButton, doneButton] 

     self.isUserInteractionEnabled = true 
     self.sizeToFit() 
    } 

    func done() { 
     // Tell the current first responder (the current text input) to resign. 
     UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) 
    } 

    func cancel() { 
     // Call "cancel" method on first object in the responder chain that implements it. 
     UIApplication.shared.sendAction(#selector(cancel), to: nil, from: nil, for: nil) 
    } 
} 

Sau đó, thêm dòng sau vào applicationDidFinishLaunching của bạn để áp dụng điều này cho tất cả các bàn phím của bạn:

let accessoryView = KeyboardAccessoryToolbar() 
    UITextField.appearance().inputAccessoryView = accessoryView 
    UITextView.appearance().inputAccessoryView = accessoryView 
Các vấn đề liên quan