当点击 UITextField 时加载一个 nib 文件作为自定义键盘
Load a nib file to act as a custom keyboard when a UITextField is tapped
我正在尝试加载 .xib
文件以在点击文本字段时用作自定义键盘。我可以在点击文本字段时显示 .xib
文件(视图),但我不确定如何将 .xib
文件中的按钮与 [=57= 中的文本字段进行通信]ViewController.swift。
这就是我到目前为止所做的。
创建了一个项目。
添加了一个 UITextField
并为其创建了一个出口。
@IBOutlet weak var myField: MyTextField!
创建了一个新的 .xib
文件并将其命名为 CustomView.xib
。
创建了一个新的 class 并将其命名为 CustomView.swift
。
已将 class 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 文件显示的文本字段时(见下图),我的问题是,如何将按钮与 ViewController.swif
中的文本字段进行通信.换句话说,我想要的是在点击时在 inputField 中显示数字。
有什么建议吗?这通常是这样做的吗?
这是一张显示点击 inputField 时显示的视图的图像。
假设您有 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
中显示良好(即 1
、12
、122
等等)。
更新(Post-评论):
我能够使用包含一些按钮的 nib
文件和 故事板 .
中的 UITextField
重新创建此文件
流程如下:
1. 创建一个带有所有按钮的笔尖(您已经完成)。
2.创建视图;在 "Custom Class" 下,将 class 重命名为该视图(即 "Custom Class" -> "Class" -> "view-that-holds-the-buttons")。
3.将IBAction
s(一共9个对应你的按键数)连线到一个单 方法如上所述。
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 个 classes.
第一个是 UIView
的子 class,它是 xib
,它包含按钮。
我们称其为“KeypadView”。
第二个是主视图控制器,关联到持有的控制器
故事板中的 UITextField
。
我们称其为“MainViewController”。
第 2 步:
首先,请创建一个新的 UIView
并将其命名为“KeypadView”,以保持一致性。
然后,单击您的 .xib 文件;在右侧面板上,单击左侧的第三个选项卡,称为“Identity Inspector”;你会看到“Custom Class -> Class”,你会将这个 xib
关联到您创建的 class(您需要这个 class,以便将 xib
文件中按钮的 IBAction
连接到它)。它将是“KeypadView”,它是 UIView
.
的子class
第6步:
您在包含按钮的 class(“KeypadView”)中声明它。
第8步:
您将此方法 (IBAction
) 连接到上述 class(即“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”class 中,应该有一个从每个按钮调用的 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
)中显示击键。
我正在尝试加载 .xib
文件以在点击文本字段时用作自定义键盘。我可以在点击文本字段时显示 .xib
文件(视图),但我不确定如何将 .xib
文件中的按钮与 [=57= 中的文本字段进行通信]ViewController.swift。
这就是我到目前为止所做的。
创建了一个项目。
添加了一个
UITextField
并为其创建了一个出口。@IBOutlet weak var myField: MyTextField!
创建了一个新的
.xib
文件并将其命名为CustomView.xib
。创建了一个新的 class 并将其命名为
CustomView.swift
。已将 class
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 文件显示的文本字段时(见下图),我的问题是,如何将按钮与 ViewController.swif
中的文本字段进行通信.换句话说,我想要的是在点击时在 inputField 中显示数字。
有什么建议吗?这通常是这样做的吗?
这是一张显示点击 inputField 时显示的视图的图像。
假设您有 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
中显示良好(即 1
、12
、122
等等)。
更新(Post-评论):
我能够使用包含一些按钮的 nib
文件和 故事板 .
UITextField
重新创建此文件
流程如下:
1. 创建一个带有所有按钮的笔尖(您已经完成)。
2.创建视图;在 "Custom Class" 下,将 class 重命名为该视图(即 "Custom Class" -> "Class" -> "view-that-holds-the-buttons")。
3.将IBAction
s(一共9个对应你的按键数)连线到一个单 方法如上所述。
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 个 classes.
第一个是 UIView
的子 class,它是 xib
,它包含按钮。
我们称其为“KeypadView”。
第二个是主视图控制器,关联到持有的控制器
故事板中的 UITextField
。
我们称其为“MainViewController”。
第 2 步:
首先,请创建一个新的 UIView
并将其命名为“KeypadView”,以保持一致性。
然后,单击您的 .xib 文件;在右侧面板上,单击左侧的第三个选项卡,称为“Identity Inspector”;你会看到“Custom Class -> Class”,你会将这个 xib
关联到您创建的 class(您需要这个 class,以便将 xib
文件中按钮的 IBAction
连接到它)。它将是“KeypadView”,它是 UIView
.
第6步:
您在包含按钮的 class(“KeypadView”)中声明它。
第8步:
您将此方法 (IBAction
) 连接到上述 class(即“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”class 中,应该有一个从每个按钮调用的 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
)中显示击键。