Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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 奇怪的行为-在willMoveToSuperview中实例化UITextField,而不是didMoveToSuperview_Ios_Swift_Oop_Uiview_Uitextfield - Fatal编程技术网

Ios 奇怪的行为-在willMoveToSuperview中实例化UITextField,而不是didMoveToSuperview

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

我正在使用XCode 6.3/iOS/Swift 1.2。我刚刚偶然发现了一些我不理解的奇怪行为(来自强大的OO背景)

简单地说,如果我将UIView子类化并使用它实例化一些UITextFields;在构造函数中,动态地(即,通过单击事件)重写didMoveToSuperview。。。UITextFields按预期工作。但是,在willMoveToSuperview期间创建UITextField对象时,它看起来很好。。。但它对触摸事件没有反应

下面的代码(UIViewController和子类UIView)演示了这一点。我在包含UITextFields的整个视图中添加了一个手势识别器。单击除在willMoveToSuperview期间创建的按钮之外的任何按钮,都会将焦点移动到该文本字段,并忽略触摸事件(如预期的那样)。但是,单击在willMoveToSuperview期间添加的按钮将触发触摸事件。没有触摸事件的事件。。。此文本字段仍然没有响应。有人能解释这种行为吗

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-我有理由这样做