当点击 UITextField 时,加载 nib 文件以充当自定义键盘

Posted

技术标签:

【中文标题】当点击 UITextField 时,加载 nib 文件以充当自定义键盘【英文标题】:Load a nib file to act as a custom keyboard when a UITextField is tapped 【发布时间】:2016-02-20 02:47:43 【问题描述】:

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

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

    创建了一个项目。

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

    @IBOutlet weak var myField: MyTextField!
    

    创建了一个新的.xib 文件并将其命名为CustomView.xib

    创建了一个新类并将其命名为CustomView.swift

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

    CustomView.xib 文件中添加了一些UIButtons。这些将充当自定义键盘,它们将在点击 textField 时显示,并在调用 resignFirstResponder 方法时隐藏。

    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
        
    
    

    完成

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

有什么建议吗?这就是通常的做法。

这是一张图片,显示了点击 inputField 时显示的视图。

【问题讨论】:

【参考方案1】:

假设您有 9 个UIButtons,然后考虑 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 等)。

更新(评论后):

我能够在 storyboard 中使用包含几个按钮的 nib 文件和 UITextField 重新创建它。

流程如下:

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

2. 创建视图;并在“自定义类”下,将类重命名为此视图(即“自定义类”->“类”->“view-that-holds-the-buttons”)。

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

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 个班级。

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

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

第 2 步:

首先,请创建一个新的UIView,并将其命名为“KeypadView”。 然后,单击您的 .xib 文件;在右侧面板上,单击左侧第三个选项卡,称为“Identity Inspector”;您会看到“Custom Class -> Class”,您可以在其中将此 xib 与您创建的类相关联(您需要这个类,以便连接 @ 987654365@ 用于从 xib 文件到它的按钮)。它将是“KeypadView”,它是UIView 的子类。

第 6 步:

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

第 8 步:

您将此方法 (IBAction) 连接到上述类(即“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”类中,应该有一个从每个按钮调用的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)中显示击键。

【讨论】:

我知道如何将值从 uibutton 显示到文本字段,我的问题是按钮位于 .xib 文件中,而文本字段位于主情节提要中。谢谢 抱歉,我之前的帖子我弄明白了就删了。非常感谢您的帮助。

以上是关于当点击 UITextField 时,加载 nib 文件以充当自定义键盘的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 Nib 加载的 UITextField 的默认字体太小?

UIView 在加载 NIB 文件后立即显示?

当应用程序在主 window.xib 上运行时如何使用新的 nib 文件加载应用程序

当视图控制器从 nib 文件加载时,以模态方式在当前上下文中呈现视图控制器

Nib 文件在加载时忽略状态栏。为啥?

加载时 NIB 视图没有子视图