当点击 UITextField 时加载一个 nib 文件作为自定义键盘

Load a nib file to act as a custom keyboard when a UITextField is tapped

我正在尝试加载 .xib 文件以在点击文本字段时用作自定义键盘。我可以在点击文本字段时显示 .xib 文件(视图),但我不确定如何将 .xib 文件中的按钮与 [=57= 中的文本字段进行通信]ViewController.swift。

这就是我到目前为止所做的。

  1. 创建了一个项目。

  2. 添加了一个 UITextField 并为其创建了一个出口。

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

  4. 创建了一个新的 class 并将其命名为 CustomView.swift

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

  6. CustomView.xib 文件中添加了一些 UIButtons。这些将充当自定义键盘,它们将在点击 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. 完成

当我 运行 应用程序并点击 .xib 文件显示的文本字段时(见下图),我的问题是,如何将按钮与 ViewController.swif 中的文本字段进行通信.换句话说,我想要的是在点击时在 inputField 中显示数字。

有什么建议吗?这通常是这样做的吗?

这是一张显示点击 inputField 时显示的视图的图像。

假设您有 9 个 UIButton,然后考虑 ctrl + 将故事板中所有这些按钮的 IBAction 拖到 方法如:

- (IBAction)tapped:(id)sender
{
    textView.text = [NSString stringWithFormat:@"%@%li", textView.text, (long)((UIButton*)sender).tag];
    NSLog(@"%@", textView.text);
}

鉴于 textField 是您的文本字段,您可以使用 tag 属性 从您的键盘(也就是说,按钮)附加每个相应的数字按钮和上述方法。

您可以为情节提要中的每个按钮设置标签编号(即分别为 1 - 9)。

我没有使用 9 个按钮对其进行测试,而是只使用了 2 个,每个按钮的标签编号分别为 1 和 2。结果在 UITextField 中显示良好(即 112122 等等)。

更新(Post-评论):

我能够使用包含一些按钮的 nib 文件和 故事板 .

中的 UITextField 重新创建此文件

流程如下:

1. 创建一个带有所有按钮的笔尖(您已经完成)。

2.创建视图;在 "Custom Class" 下,将 class 重命名为该视图(即 "Custom Class" -> "Class" -> "view-that-holds-the-buttons")。

3.IBActions(一共9个对应你的按键数)连线到一个 方法如上所述。

4. 在您的另一个视图控制器中,其视图持有 UITextField,使用您现有的方法加载笔尖。

5. 添加此视图(来自 nib)作为子视图。

以下内容涉及视图(包含按钮以及 IBAction 方法)和加载 nib 的控制器之间的通信:

6. 创建一个delegate (weak) 属性.

7. 在添加视图之前(来自 nib),将此 delegate 分配给视图控制器(加载 nib).

8. 创建协议:

例如:

protocol keypadProtocol : class
{
    func displayKeys(keystrokeObject: AnyObject)
}

让加载 nib 的视图控制器符合此协议并实现所需的方法 (displayKeys):

//The one that loads the nib, which also holds the UITextField
class mainViewController: UIViewController, keypadProtocol

因此,一旦点击按钮,就会调用 IBAction;但是我们没有显示它,而是将 sender 发送到我们的 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 个 classes.

第一个是 UIView 的子 class,它是 xib,它包含按钮。 我们称其为“KeypadView”。

第二个是主视图控制器,关联到持有的控制器 故事板中的 UITextField。 我们称其为“MainViewController”。

第 2 步:

首先,请创建一个新的 UIView 并将其命名为“KeypadView”,以保持一致性。
然后,单击您的 .xib 文件;在右侧面板上,单击左侧的第三个选项卡,称为“Identity Inspector”;你会看到“Custom Class -> Class”,你会将这个 xib 关联到您创建的 class(您需要这个 class,以便将 xib 文件中按钮的 IBAction 连接到它)。它将是“KeypadView”,它是 UIView.

的子class

第6步:

您在包含按钮的 class(“KeypadView”)中声明它。

第8步:

您将此方法 (IBAction) 连接到上述 class(即“KeypadView”)。

从“mainViewController”中加载 xib(“KeypadView”)后,将“KeypadView”中的 delegate 设置为 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”class 中,应该有一个从每个按钮调用的 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)中显示击键。