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

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

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

  1. 创建了一个项目。

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

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

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

  5. 将类 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 文件显示的 textField 时(见下图),我的问题是,如何将按钮与 ViewController.swif 中的 textField 进行通信。换句话说,我想要的是在输入字段中显示被点击的数字。

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

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

【问题讨论】:

    标签: ios swift xib custom-keyboard inputview


    【解决方案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 文件中,而文本字段位于主情节提要中。谢谢
    • 抱歉,我之前的帖子我弄明白了就删了。非常感谢您的帮助。
    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2012-02-08
    • 2018-05-02
    相关资源
    最近更新 更多