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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

UIView详解之一:UIView简介

当 UITextField 被填充时,从一个类向视图控制器发送信号或触发函数

在全局范围内将自定义输入视图设置为所有textFields的最简单方法

利用知识付费每天收益900,嗨购严选微课类也可以

springmvc之RequestMapping注解既可以修饰类也可以修饰方法

Java中抽象类也能实例化.RP