ios - 敲击UITextField时,加载一个nib文件以充当自定义键盘

标签 ios swift xib custom-keyboard inputview

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

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

  • 创建了一个项目。
  • 添加了UITextField并为其创建了出口。
    @IBOutlet weak var myField: MyTextField!
    
  • 创建了一个新的.xib文件,并将其命名为CustomView.xib
  • 创建一个新类,并将其命名为CustomView.swift
  • 将类CustomView.swift分配给CustomView.xib文件。
  • UIButtons文件中添加了一些CustomView.xib。它们将充当自定义键盘,它们将在点击textField时显示,并在调用resignFirstResponder方法时隐藏。
  • viewDidLoadViewController.swift方法中,我分配了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中显示数字。

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

    这是一个图像,显示了在轻敲inputField时显示的视图。

    enter image description here

    最佳答案

    假设您有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等)中显示正常。

    更新(评论后):

    我能够使用Storyboard中包含一些按钮和nibUITextField文件重新创建此文件。

    该过程如下:

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

    2. 创建一个视图;并在“自定义类”下,将该类重命名为此视图(即“自定义类”->“类”->“按钮的视图”)。

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

    4. 在另一个视图控制器中,该视图控制器的视图中包含UITextField,请使用现有方法加载笔尖。

    5. 将此视图(来自笔尖)添加为子视图。

    以下是有关视图(包含按钮和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
    }
    

    在加载delegate文件的控制器中声明nib:
    weak var delegate : keypadProtocol?
    

    从加载delegate的视图控制器中分配nib:
    keyPadView.delegate = self //keyPadView is the nib file loaded
    

    回复您的第二条评论:

    假设:

    我们有2节课。

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

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

    步骤2:

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

    步骤6:

    您可以在保存按钮的类(“KeypadView”)中声明此内容。

    步骤8:

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

    一旦从“mainViewController”内加载了xib(“KeypadView”),就将“KeypadView”中的delegate设置为self(self是“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)中显示按键。

    关于ios - 敲击UITextField时,加载一个nib文件以充当自定义键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518517/

    相关文章:

    swift 。让我们重写但不调用该方法

    ios - iOS在运行时更改Localizable.strings

    ios - 如何通过发送产品名称来查找特定的产品 ID?

    ios - 如何根据 Swift 中的持续时间更改 UI 中的图像

    ios - 如何实现两个 Storyboard? ios

    ios - 随着 UILabel 内部的增长扩展 UIView

    objective-c - Horizo​​ntal UIScrollView having vertical UIScrollViews inside - 如何防止在滚动外部水平 View 时滚动内部 ScrollView ?

    ios - registerForRemoteNotifications 方法未被正确调用

    ios - 什么是 iOS OpenGL ES 2.0 离屏帧缓冲区对象?

    ios - Non-Storyboard xib 的容器 View 不显示