
這是一個基本的 app 內(nèi)建鍵盤。相同的方法可以用來制作任意鍵盤布局凿宾。主要需要完成這些事:
- 在一個 .xib 文件里創(chuàng)建鍵盤布局瓶埋,owner 是一個 .swift 文件,包含一個
UIView
子類腐芍。 - 告訴
UITextField
使用自定義鍵盤。 - 使用 delegate 在鍵盤和主視圖控制器之間通信试躏。
創(chuàng)建 .xib 鍵盤布局文件
- 在 Xcode 里點擊 File > New > File... > iOS > User Interface > View 來創(chuàng)建 .xib 文件猪勇。
- 我把自己的稱為 Keyboard.xib
- 添加你需要的按鈕。
- 使用 auto layout constraints颠蕴,這樣不論鍵盤的大小是多少泣刹,按鈕都會因此改變大小。
- 設置 File's Owner (不是 root view)為 Keyboard.swift 文件犀被。這里通常會出現(xiàn)錯誤椅您。最后會講。
創(chuàng)建 .swift UIView 子類鍵盤文件
在 Xcode 里點擊 File > New > File... > iOS > Source > Cocoa Touch Class 來創(chuàng)建 .swift 文件弱判。
我把自己的成為 Keyboard.swift
-
添加如下代碼:
import UIKit // view controller 會采用這個協(xié)議(delegate) // 這樣它就必須包含 keyWasTapped 方法 protocol KeyboardDelegate: class { func keyWasTapped(character: String) } class Keyboard: UIView { // 這個變量會被設置為 view controller 然后 // 鍵盤就能給 view controller 發(fā)送消息 weak var delegate: KeyboardDelegate? // MARK:- 鍵盤初始化 required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) initializeSubviews() } override init(frame: CGRect) { super.init(frame: frame) initializeSubviews() } func initializeSubviews() { let xibFileName = "Keyboard" // 不包括 xib 后綴名 let view = NSBundle.mainBundle().loadNibNamed(xibFileName, owner: self, options: nil)[0] as! UIView self.addSubview(view) view.frame = self.bounds } // MARK:- .xib 文件里的按鈕 action @IBAction func keyTapped(sender: UIButton) { // 按鈕被按下后襟沮,發(fā)送信息給 // delegate (也就是, 那個 view controller) self.delegate?.keyWasTapped(sender.titleLabel!.text!) // 也可以選擇發(fā)送 tag 值 } }
按住 control 從 .xib 文件里的按鈕拖到 .swift 文件里的
@IBAction
方法,這樣就能把它們綁定在一起注意協(xié)議和 delegate 代碼昌腰】看這篇答案簡單解釋了 delegate 是如何工作的。
設置 View Controller
添加一個
UITextField
到 main storyboard 里遭商,然后用一個IBOutlet
連接到你的 view controller固灵。稱它為textField
。-
給 View Controller 使用下面的代碼:
import UIKitclass ViewController: UIViewController, KeyboardDelegate { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // 初始化自定義鍵盤 let keyboardView = Keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 300)) keyboardView.delegate = self // 鍵盤會通知視圖控制器劫流,在按下一個鍵的時候 // 替換系統(tǒng)鍵盤為自定義鍵盤 textField.inputView = keyboardView } // 鍵盤 delegate 協(xié)議必須的方法 func keyWasTapped(character: String) { textField.insertText(character) } }
注意 view controller 采用了我們在上面定義的
KeyboardDelegate
協(xié)議巫玻。
常見錯誤
如果你得到了一個 EXC_BAD_ACCESS 錯誤,大概是因為你設置了 view 的 custom class 為 Keyboard.swift 而不是 nib File's Owner祠汇。
選擇 Keyboard.nib 然后選擇 File's Owner仍秤。

確定 root view 的 custom class 是空的。
