UIView 的一个类也可以是 UITextFieldDelegate 吗?
Posted
技术标签:
【中文标题】UIView 的一个类也可以是 UITextFieldDelegate 吗?【英文标题】:Can a class of UIView also be a UITextFieldDelegate? 【发布时间】:2015-08-12 13:58:28 【问题描述】:我对 Swift 编程非常陌生,我想了解为什么我不能让自定义 UIView 类也充当 TextFields 的委托。我已经转换了适用于 ViewController 的代码,但运气不佳。 错误是: 致命错误:在展开可选值时意外发现 nil 由以下行生成:textField.delegate = self
代码如下:
import UIKit
class ViewClass: UIView, UITextFieldDelegate
var textItems = [UITextInput]()
var myKB = UIToolbar()
var txtActive = 0
@IBOutlet weak var textField: UITextField!
required init?(coder decoder: NSCoder)
super.init(coder: decoder)
textField.delegate = self
// UITextField Delegates
func textFieldDidBeginEditing(textField: UITextField)
print("TextField did begin editing method called")
func textFieldDidEndEditing(textField: UITextField)
print("TextField did end editing method called")
func textFieldShouldBeginEditing(textField: UITextField) -> Bool
print("TextField should begin editing method called")
return true;
func textFieldShouldClear(textField: UITextField) -> Bool
print("TextField should clear method called")
return true;
func textFieldShouldEndEditing(textField: UITextField) -> Bool
print("TextField should snd editing method called")
return true;
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
print("While entering the characters this method gets called")
return true;
func textFieldShouldReturn(textField: UITextField) -> Bool
print("TextField should return method called")
textField.resignFirstResponder();
return true;
这是不可能的,还是我错过/误解了一些基本的东西??
【问题讨论】:
可以的。它可能不应该。 我很确定问题出在您的textField
上。由于某种原因,它没有正确加载。如果你在那里放一个if
检查并检查为零,或者只是在那里放一个断点,你可以证实我的怀疑。
正确!文本字段为零。 @duncan-c 建议的 awakeFromNib() 解决了这个问题。但是,在查看了 cmets 之后,似乎我最好将代码放在 View Controller 中
【参考方案1】:
简短回答:您可以将视图设置为文本字段的委托,但您不应该这样做。
视图对象显示数据。控制器对象实现您的应用程序的逻辑。你不应该在你的视图对象中存储模型数据,它们也不应该有逻辑。
至于怎么做:
在 init 中未连接插座。对于视图控制器,您可以假设您的插座已连接的地方是 viewDidLoad。对于视图对象,您可以假设所有内容都已连接的地方是awakeFromNib()
方法。您应该实现awakeFromNib()
并在那里设置您的委托。
【讨论】:
awakeFromNib()
工作!我正在尝试实现我的 kb accessoryView 工具栏(它可以工作 - 减去与文本相关的代表),将 textField/textView 项从背景 UIView 循环到一个数组中。我用类控制下一个/上一个导航等,但不能调用委托(尝试在存储到数组之前将使用myTxt.delegate = self
的委托添加到文本对象中,但没有成功)。我将修改代码以使用 ViewControllers(或 scrollViews)并调用共享函数(?)以返回附件视图和文本对象数组,使用 VC 处理委托。感谢大家的帮助!【参考方案2】:
这不是 UITextFieldDelegate 的问题,而是您如何设置文本字段的问题。你是在告诉班级 textField 是一个 IBOutlet 肯定会被这行代码连接起来
@IBOutlet weak var textField: UITextField!
但是,当它尝试在 init 方法中访问 textField 时,会引发编译器错误,提示 textField 中没有任何内容。
所以 textField 的 IBOutlet 可能需要连接到相关故事板中的某些东西
【讨论】:
以上是关于UIView 的一个类也可以是 UITextFieldDelegate 吗?的主要内容,如果未能解决你的问题,请参考以下文章
当 UITextField 被填充时,从一个类向视图控制器发送信号或触发函数
在全局范围内将自定义输入视图设置为所有textFields的最简单方法