3

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

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

  1. 创建了一个项目。

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

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

  4. 创建了一个新类并调用它CustomView.swift

  5. 分配CustomView.swiftCustomView.xib文件的类。

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

  7. 在我分配的viewDidLoad方法如下。ViewController.swiftinputView

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

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

这是一个图像,显示了点击 inputField 时显示的视图。

在此处输入图像描述

4

1 回答 1

1

假设您有 9UIButton秒,然后考虑+从情节提要中的所有这些按钮中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(即,,,1等等12)中显示良好122

更新(评论后):

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

该过程如下进行:

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

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

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

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

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它,而是displayKeysUITextField.

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在加载的视图控制器中分配from nib

keyPadView.delegate = self //keyPadView is the nib file loaded

回复您的第二条评论:

假设:

我们有 2 节课。

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

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

第2步:

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

第 6 步:

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

第 8 步:

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

从“mainViewController”中加载xib(“KeypadView”)后,将“KeypadView”中的设置delegateselfself是“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从每个按钮调用的:

IE,

@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)中显示击键。

于 2016-02-20T03:15:50.397 回答