加载一个笔尖文件作为一个自定义键盘,当一个UITextField被点击
我试图加载一个.xib
文件作为一个自定义键盘,当一个textField被点击。 我能够显示.xib
文件(视图),当textField被点击,但我不知道如何沟通.xib
文件中的button与ViewController.swift中的textField。
这是我迄今为止所做的。
-
创build一个单一的项目。
-
添加了一个
UITextField
并为它创build了一个出口。@IBOutlet weak var myField: MyTextField!
-
创build一个新的
.xib
文件并将其命名为CustomView.xib
。 -
创build一个新的类,并将其称为
CustomView.swift
。 -
将类
CustomView.swift
分配给CustomView.xib
文件。 -
在
CustomView.xib
文件中添加了一些UIButtons
。 这些将作为一个自定义键盘,他们将显示什么时候resignFirstResponder
textField,并在调用resignFirstResponder
方法时隐藏。 -
在
ViewController.swift
的viewDidLoad
方法中,我分配了inputView
如下。import UIKit class ViewController: UIViewController { @IBOutlet weak var myField: MyTextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let myView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as? CustomView myField.inputView = myView } }
-
完成
当我运行应用程序,并点击textField .xib文件显示(见下图),我的问题是,如何与ViewController.swif
的textField通信的button。 换句话说,我想要的是当它们被点击时在inputField中显示数字。
有什么build议么? 这是如何通常这样做。
这里是一个图像,显示了当inputField被点击时显示的视图。
比方说,你有9个UIButton
,然后考虑ctrl +从故事板中的所有这些button拖动一个IBAction
到一个单一的方法,如:
- (IBAction)tapped:(id)sender { textView.text = [NSString stringWithFormat:@"%@%li", textView.text, (long)((UIButton*)sender).tag]; NSLog(@"%@", textView.text); }
如果textField
是文本字段,则可以使用这些button的tag
属性和上述方法从键盘(也就是button)追加每个相应的数字。
您可以设置故事板中每个单独button的标签编号(分别为1 – 9)。
我没有使用9个button进行testing,而是只对2个进行testing,每个button的标签号分别为1和2。 结果在UITextField
中显示得很好(即, UITextField
等)。
更新(发表评论):
我可以使用包含几个button和一个UITextField
的nib
文件在故事板中重新创build它。
过程如下进行:
1.用所有的button(你已经完成)创build一个笔尖。
2.创build一个视图; 并在“自定义类”下,将该类重新命名为该视图(即,“自定义类” – >“类” – >“查看该button”)。
3.如上所述,将IBAction
(总共9个对应于您的button数量)连接到一个单一的方法。
4.在你的其他视图控制器的视图保存UITextField
,使用你现有的方法加载笔尖。
5.将此视图(从nib)添加为子视图。
以下是关于视图(包含button和IBAction
方法)与加载nib
的控制器之间的通信的问题:
6.创build一个delegate
( weak
)属性。
7.添加视图之前(从nib
),分配此delegate
与视图控制器(加载nib
的控制)。
8.创build一个协议:
例如:
protocol keypadProtocol : class { func displayKeys(keystrokeObject: AnyObject) }
让加载nib
的视图控制器符合此协议并实现所需的方法( displayKeys
):
//The one that loads the nib, which also holds the UITextField class mainViewController: UIViewController, keypadProtocol
所以,一旦点击button, IBAction
将被调用; 但不是显示它,我们将发送sender
给我们的delegate
, delegate
是执行displayKeys
方法并保存UITextField
的视图控制器。
IBAction
将执行如下:
@IBAction func tapped(sender: AnyObject) { delegate!.displayKeys(sender) }
displayKeys
将被执行如下:
func displayKeys(keystrokeObject: AnyObject) { textView.text = NSString(format: "%@%li", textView.text! ?? "", (keystrokeObject as! UIButton).tag) as String }
在加载nib
文件的控制器中的delegate
声明:
weak var delegate : keypadProtocol?
从加载nib
的视图控制器中分配delegate
:
keyPadView.delegate = self //keyPadView is the nib file loaded
回复你的第二个评论:
假设:
我们有2个class。
第一个是UIView
的子类,它是包含button的xib
。 我们称之为“KeypadView”。
第二个是主视图控制器,它与控制器相关联,控制器在故事板中保存UITextField
。 我们称之为“MainViewController”。
第2步:
首先,为了保持一致性,请创build一个新的UIView
并将其命名为“KeypadView”。
然后,点击你的.xib文件; 在右侧面板上,点击左侧的第三个标签,即“ 身份检查员 ”。 你会看到“ Custom Class – > Class ”,你可以把这个xib
关联到你创build的类(你需要这个类,以便将xib
文件中的button从IBAction
连接到它)。 这将是“KeypadView”,它是UIView
一个子类。
第六步:
你在包含button的类(“KeypadView”)中声明这个。
第八步:
您将此方法( IBAction
)连接到上述类(即“KeypadView”)。
从“mainViewController”中加载xib
(“KeypadView”)后,将“KeypadView”中的代理设置为self
( self
为“MainViewController”):
let keyPadView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil).first as? KeyPadView keyPadView.delegate = self self.view.addSubview(keypadView) //you may need to re-adjust the position of the views; I will leave that to you
在你的“KeyPadView”类中,应该有一个从每个button被调用的IBAction
:
也就是说,
@IBAction func tapped(sender: AnyObject) { delegate!.displayKeys(sender) }
如果你还记得,我们的delegate
是“mainViewController”。
由于displayKeys
在“mainViewController”中实现,因此将在其中调用以下方法:
func displayKeys(keystrokeObject: AnyObject) { textView.text = NSString(format: "%@%li", textView.text! ?? "", (keystrokeObject as! UIButton).tag) as String }
然后“mainViewController”将在其UITextField
(即,textView)中显示击键。