Swift:为什么不调用我的UITextFieldDelegate方法?

时间:2017-05-20 21:46:02

标签: ios swift

我正在尝试以编程方式创建UITextView并创建一个委托来处理事件。我能够创建添加和UITextView就好了,但没有添加任何UITextFieldDelegate方法。 为什么会这样?

    let myTextField = UITextField()
    myTextField.frame = CGRect(x:0, y: 100, width: 300, height: 30)
    myTextField.text = "Example Text"

    class MyTextFieldDelegate : NSObject, UITextFieldDelegate {
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            // Hide the keyboard.
            print("should return!\n")
            textField.resignFirstResponder()
            return true
        }

        func textFieldDidEndEditing(_ textField: UITextField) {
            print("yay!\n")
            print(textField.text! + "\n")
        }

        func textFieldDidBeginEditing(_ textField: UITextField) {
            print("yay begin!\n")
            print(textField.text! + "\n")
        }

    }

    let myTextFieldDelegate = MyTextFieldDelegate()
    myTextField.delegate = myTextFieldDelegate
    scrollView.addSubview(myTextField)

3 个答案:

答案 0 :(得分:2)

UITextField中,delegate被声明为weak属性。

weak var delegate: UITextFieldDelegate? { get set }

这意味着它不会保留delegate实例,并且会在nil被释放时设置为delegate

您正在创建delegate并将其分配给本地变量myTextFieldDelegate。该变量将在函数结束时释放,因此即使您将myTextFieldDelegate分配给myTextField.delegate,它也会被释放,myTextField.delegate会被设置为nil,因为它是ViewController弱。

要解决此问题,请在var myTextFieldDelegate: MyTextFieldDelegate? 中创建一个属性来保存委托对象:

import sys
import file4


# skip the first item which is the files name
arguments = tuple(sys.argv[1:])
file4.function_to_be_called(arguments)

答案 1 :(得分:1)

因为没有人保留myTextfieldVariable ......一种方法是拥有一个实例变量来保持对它的强引用

答案 2 :(得分:1)

按照惯例,委托引用很弱。这可以防止保留周期。

因此,当你说

this

文本字段不包含对代理的拥有引用。

如果您创建myDelegate对象的代码位于方法内:

myTextField.delegate = myTextFieldDelegate

然后变量func someFunction() { let myTextFieldDelegate = MyTextFieldDelegate() myTextField.delegate = myTextFieldDelegate scrollView.addSubview(myTextField) } 拥有对新创建的myTextFieldDelegate对象的强引用。但是,只要函数返回,变量MyTextFieldDelegate就会超出范围。

myTextFieldDelegate对象不再具有任何强引用,因此会被取消分配。

如同vacawama在他的评论中建议的那样,你需要你的视图控制器有一个具有强引用的实例变量:

MyTextFieldDelegate