Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView类也可以是UIExtFieldDelegate吗?_Ios_Swift_Uiview_Uitextfield_Uikit - Fatal编程技术网

Ios UIView类也可以是UIExtFieldDelegate吗?

Ios UIView类也可以是UIExtFieldDelegate吗?,ios,swift,uiview,uitextfield,uikit,Ios,Swift,Uiview,Uitextfield,Uikit,我对Swift编程非常陌生,我试图理解为什么不能让自定义UIView类也充当TextFields的委托。我已经转换了与ViewController一起工作的代码,但运气不好。 错误是: 致命错误:在展开可选值时意外发现nil 由以下行生成:textField.delegate=self 代码如下: import UIKit class ViewClass: UIView, UITextFieldDelegate { var textItems = [UITextInput]() var my

我对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;
}
}

这是不可能的,还是我遗漏了/误解了一些基本信息???

这不是UITextFieldDelegate的问题,而是如何设置textfield的问题。您告诉类textField是一个IBOutlet,它肯定会被这行代码连接

@IBOutlet weak var textField: UITextField!
然而,当它试图在init方法中访问textField时,它抛出一个编译器错误,表示textField中没有任何内容


因此,textField的IBOutlet可能需要连接到相关故事板中的某个内容。简短回答:您可以将视图设置为文本字段的代理,但您不应该这样做

查看对象显示数据。控制器对象实现应用程序的逻辑。您不应该在视图对象中存储模型数据,也不应该在其中包含逻辑

至于如何做到这一点:


init中未连接插座。对于视图控制器,可以假定插座已连接的位置是viewDidLoad。对于视图对象,可以假定所有对象都已连接的位置是
awakeFromNib()
方法。您应该实现
awakeFromNib()
并在那里设置您的委托。

它可以。可能不应该。我很确定问题出在你的
文本字段上。由于某些原因,它没有正确加载。如果你在那里放一个
If
检查并检查为零,或者只是在那里放一个断点,你可以确认我的疑问。正确!文本字段为零。@duncan-c建议的awakeFromNib()解决了这个问题。但是,在查看注释后,似乎我最好将代码放在视图控制器中
awakeFromNib()
worked!我试图实现我的kb accessoryView工具栏(它可以工作-减去与文本相关的委托),将textField/textView项从后台UIView循环到一个数组中。我使用类控制下一个/上一个导航等,但无法调用委托(在存储到数组中之前,尝试使用
myTxt.delegate=self
将委托添加到文本对象中,但未成功)。我将修改代码以使用ViewController(或ScrollView)并调用共享函数(?)返回accessoryView和文本对象数组,用VC处理委托。谢谢大家的帮助!