Ios 奇怪的行为-在willMoveToSuperview中实例化UITextField,而不是didMoveToSuperview
我正在使用XCode 6.3/iOS/Swift 1.2。我刚刚偶然发现了一些我不理解的奇怪行为(来自强大的OO背景) 简单地说,如果我将UIView子类化并使用它实例化一些UITextFields;在构造函数中,动态地(即,通过单击事件)重写didMoveToSuperview。。。UITextFields按预期工作。但是,在willMoveToSuperview期间创建UITextField对象时,它看起来很好。。。但它对触摸事件没有反应 下面的代码(UIViewController和子类UIView)演示了这一点。我在包含UITextFields的整个视图中添加了一个手势识别器。单击除在willMoveToSuperview期间创建的按钮之外的任何按钮,都会将焦点移动到该文本字段,并忽略触摸事件(如预期的那样)。但是,单击在willMoveToSuperview期间添加的按钮将触发触摸事件。没有触摸事件的事件。。。此文本字段仍然没有响应。有人能解释这种行为吗Ios 奇怪的行为-在willMoveToSuperview中实例化UITextField,而不是didMoveToSuperview,ios,swift,oop,uiview,uitextfield,Ios,Swift,Oop,Uiview,Uitextfield,我正在使用XCode 6.3/iOS/Swift 1.2。我刚刚偶然发现了一些我不理解的奇怪行为(来自强大的OO背景) 简单地说,如果我将UIView子类化并使用它实例化一些UITextFields;在构造函数中,动态地(即,通过单击事件)重写didMoveToSuperview。。。UITextFields按预期工作。但是,在willMoveToSuperview期间创建UITextField对象时,它看起来很好。。。但它对触摸事件没有反应 下面的代码(UIViewController和子类U
import UIKit
class RootViewController:UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
self.view.frame = CGRectMake(0,0,500,500)
}
override func viewDidAppear(animated: Bool)
{
var uiview = ExtendedUIView()
view.addSubview(uiview)
}
}
class ExtendedUIView:UIView
{
internal var hasMovedToSuperView:Bool = false
override init (frame : CGRect)
{
super.init(frame : frame)
}
convenience init()
{
self.init(frame:CGRectMake(0,0,500,500))
var tf: UITextField = UITextField(frame: CGRect(x: 0, y: 50, width: 300, height: 40))
tf.backgroundColor = UIColor.greenColor()
tf.text = "init // ok"
addSubview(tf)
}
required init(coder aDecoder: NSCoder)
{
fatalError("This class does not support NSCoding")
}
override func willMoveToSuperview(newSuperview: UIView?)
{
if (!hasMovedToSuperView) {
var tf: UITextField = UITextField(frame: CGRect(x: 0, y: 100, width: 300, height: 40))
tf.backgroundColor = UIColor.redColor()
tf.text = "willMoveToSuperview // not ok"
addSubview(tf)
}
}
override func didMoveToSuperview()
{
if (!hasMovedToSuperView) {
var tf: UITextField = UITextField(frame: CGRect(x: 0, y: 150, width: 300, height: 40))
tf.backgroundColor = UIColor.greenColor()
tf.text = "didMoveToSuperview // ok"
addSubview(tf)
hasMovedToSuperView = true
addGestureRecognizer(UITapGestureRecognizer(target:self, action:Selector("createTFDynamically:")))
}
}
func createTFDynamically(value:AnyObject)
{
var tf: UITextField = UITextField(frame: CGRect(x: 0, y: 200, width: 300, height: 40))
tf.backgroundColor = UIColor.greenColor()
tf.text = "createTFDynamically // ok"
addSubview(tf)
}
}
需要指出的是:除非您有理由这样做,否则您应该在
UIViewController
内部viewDidLoad()
方法中添加视图,并在init()
方法中向自定义视图添加视图。@JakubVano-我有理由这样做