我正在尝试以编程方式创建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)
答案 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
对象不再具有任何强引用,因此会被取消分配。
MyTextFieldDelegate