加载一个笔尖文件作为一个自定义键盘,当一个UITextField被点击

我试图加载一个.xib文件作为一个自定义键盘,当一个textField被点击。 我能够显示.xib文件(视图),当textField被点击,但我不知道如何沟通.xib文件中的button与ViewController.swift中的textField。

这是我迄今为止所做的。

  1. 创build一个单一的项目。

  2. 添加了一个UITextField并为它创build了一个出口。

     @IBOutlet weak var myField: MyTextField! 
  3. 创build一个新的.xib文件并将其命名为CustomView.xib

  4. 创build一个新的类,并将其称为CustomView.swift

  5. 将类CustomView.swift分配给CustomView.xib文件。

  6. CustomView.xib文件中添加了一些UIButtons 。 这些将作为一个自定义键盘,他们将显示什么时候resignFirstResponder textField,并在调用resignFirstResponder方法时隐藏。

  7. ViewController.swiftviewDidLoad方法中,我分配了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 } } 
  8. 完成

当我运行应用程序,并点击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和一个UITextFieldnib文件在故事板中重新创build它。

过程如下进行:

1.用所有的button(你已经完成)创build一个笔尖。

2.创build一个视图; 并在“自定义类”下,将该类重新命名为该视图(即,“自定义类” – >“类” – >“查看该button”)。

3.如上所述,将IBAction (总共9个对应于您的button数量)连接到一个单一的方法。

4.在你的其他视图控制器的视图保存UITextField ,使用你现有的方法加载笔尖。

5.将此视图(从nib)添加为子视图。

以下是关于视图(包含button和IBAction方法)与加载nib的控制器之间的通信的问题:

6.创build一个delegateweak )属性。

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给我们的delegatedelegate是执行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”中的代理设置为selfself为“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)中显示击键。