class 的 UIView 也可以是 UITextFieldDelegate 吗?
Can a class of UIView also be a UITextFieldDelegate?
我是 Swift 编程的新手,我想了解为什么我不能让自定义 UIView class 也充当 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;
}
}
这是不可能的还是我 missing/misunderstanding 一些基本的东西??
这不是 UITextFieldDelegate 的问题,而是您如何设置文本字段的问题。你是在告诉 class textField 是一个 IBOutlet,它肯定会被这行代码连接起来
@IBOutlet weak var textField: UITextField!
但是,当它尝试在 init 方法中访问 textField 时,它会抛出一个编译器错误,指出 textField 中没有任何内容。
所以 textField 的 IBOutlet 可能需要连接到相关故事板中的某些内容
简短回答:您可以将视图设为文本字段的委托,但您不应该那样做。
查看对象显示数据。控制器对象实现应用程序的逻辑。您不应将模型数据存储在视图对象中,它们也不应包含逻辑。
至于怎么做:
插座未在初始化中连接。对于视图控制器,您可以假设您的插座已连接的地方是 viewDidLoad。对于视图对象,您可以假设所有内容都已连接的地方是 awakeFromNib()
方法。您应该实施 awakeFromNib()
并在那里设置您的委托。
我是 Swift 编程的新手,我想了解为什么我不能让自定义 UIView class 也充当 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;
}
}
这是不可能的还是我 missing/misunderstanding 一些基本的东西??
这不是 UITextFieldDelegate 的问题,而是您如何设置文本字段的问题。你是在告诉 class textField 是一个 IBOutlet,它肯定会被这行代码连接起来
@IBOutlet weak var textField: UITextField!
但是,当它尝试在 init 方法中访问 textField 时,它会抛出一个编译器错误,指出 textField 中没有任何内容。
所以 textField 的 IBOutlet 可能需要连接到相关故事板中的某些内容
简短回答:您可以将视图设为文本字段的委托,但您不应该那样做。
查看对象显示数据。控制器对象实现应用程序的逻辑。您不应将模型数据存储在视图对象中,它们也不应包含逻辑。
至于怎么做:
插座未在初始化中连接。对于视图控制器,您可以假设您的插座已连接的地方是 viewDidLoad。对于视图对象,您可以假设所有内容都已连接的地方是 awakeFromNib()
方法。您应该实施 awakeFromNib()
并在那里设置您的委托。