当点击 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 文件以充当自定义键盘的主要内容,如果未能解决你的问题,请参考以下文章