当点击 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.swift
的viewDidLoad
方法中,我将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 个UIButton
s,然后考虑 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
等)。
更新(评论后):
我能够在 storyboard 中使用包含几个按钮的 nib
文件和 UITextField
重新创建它。
流程如下:
1.创建一个包含所有按钮的笔尖(您已经完成了)。
2. 创建视图;并在“自定义类”下,将类重命名为此视图(即“自定义类”->“类”->“view-that-holds-the-buttons”)。
3. 如上所述,将IBAction
s(总共 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
设置为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
)中显示击键。
【讨论】:
我知道如何将值从 uibutton 显示到文本字段,我的问题是按钮位于 .xib 文件中,而文本字段位于主情节提要中。谢谢 抱歉,我之前的帖子我弄明白了就删了。非常感谢您的帮助。以上是关于当点击 UITextField 时,加载 nib 文件以充当自定义键盘的主要内容,如果未能解决你的问题,请参考以下文章
为啥从 Nib 加载的 UITextField 的默认字体太小?
当应用程序在主 window.xib 上运行时如何使用新的 nib 文件加载应用程序