我正在尝试加载.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
方法时隐藏。 viewDidLoad
的ViewController.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时显示的视图。
最佳答案
假设您有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
等)中显示正常。更新(评论后):
我能够使用Storyboard中包含一些按钮和
nib
的UITextField
文件重新创建此文件。该过程如下:
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/