Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 removeFromSuperview()不';在触控范围内被呼叫时,斯威夫特不工作_Ios_Swift - Fatal编程技术网

Ios removeFromSuperview()不';在触控范围内被呼叫时,斯威夫特不工作

Ios removeFromSuperview()不';在触控范围内被呼叫时,斯威夫特不工作,ios,swift,Ios,Swift,我在方法didMove(to view:)中添加了一个名为textView的UITextView,并希望在方法touchedStart中删除它。但是removeFromSuperview()不起作用。textView的superview为零,但self.view的子视图仍包含textView 如果我在didMove(to view:)中调用textView.removeFromSuperview,它将从self.view中删除 即使我设置textView.ishiden=true,textVie

我在方法didMove(to view:)中添加了一个名为textView的UITextView,并希望在方法touchedStart中删除它。但是removeFromSuperview()不起作用。textView的superview为零,但self.view的子视图仍包含textView

如果我在didMove(to view:)中调用textView.removeFromSuperview,它将从self.view中删除

即使我设置textView.ishiden=true,textView仍在屏幕上

这是代码

import UIKit
import SpriteKit

class InputScene: GameScene,UITextViewDelegate {

    var textView: UITextView!{
    willSet {
        //willSet the subview: Optional([])
        //willSet the subview: Optional([<UITextView: 0x7f94b80c1800; frame = (20 198.667; 374 200); text = ''; clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001a05cb0>; layer = <CALayer: 0x600001418a00>; contentOffset: {0, 0}; contentSize: {374, 192}; adjustedContentInset: {0, 0, 0, 0}>])
        print("willSet the subview: \(self.view?.subviews)")
        return
    }
}
    var transLabel = SKLabelNode(text: "Go to Game Scene.")

    override func didMove(to view: SKView) {
        // Set the textView
        backgroundColor = .white
        textView = UITextView(frame: CGRect(x: 150, y: 0, width: self.size.width-40, height: 200))
        textView.center = CGPoint(x: self.size.width/2, y: self.size.height/3)
        textView.backgroundColor = UIColor.red

        // Add subview and show that it has been added
        self.view?.addSubview(textView)

        // Print self.view's for the first time.
        //The subviews: [<UITextView: 0x7fbe3984f600; frame = (20 198.667; 374 200); text = ''; clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001c5da40>; layer = <CALayer: 0x60000124af40>; contentOffset: {0, 0}; contentSize: {374, 192}; adjustedContentInset: {0, 0, 0, 0}>]
        //The subviews: [<UITextView: 0x7fbe3984f600; frame = (20 198.667; 374 200); text = ''; clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001c5da40>; layer = <CALayer: 0x60000124af40>; contentOffset: {0, 0}; contentSize: {374, 192}; adjustedContentInset: {0, 0, 0, 0}>, <UITextView: 0x7fbe3a84cc00; frame = (20 198.667; 374 200); text = ''; clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600001c58d20>; layer = <CALayer: 0x600001244f00>; contentOffset: {0, 0}; contentSize: {374, 192}; adjustedContentInset: {0, 0, 0, 0}>]
        print("The subviews: \(view.subviews)")

        // Add transfer label
        transLabel.position = CGPoint(x: size.width/2, y: size.height/2)
        transLabel.fontColor = UIColor.black
        addChild(transLabel)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else {
            return
        }
        if transLabel.contains(touch.location(in: self)) {
                self.textView.removeFromSuperview()
                self.textView.isHidden = true

            // Print the textView's superview
            // The textView's superview: nil
            print("The textView's superview: \(String(describing: textView.superview))")

            // Print the self.view's subview for the second time.
            // The self.view's subview still contains the textView
            // The subviews: Optional([<UITextView: 0x7fc60b8a9000; frame = (20 198.667; 374 200); text = ''; clipsToBounds = YES; gestureRecognizers = <NSArray: 0x60000332a280>; layer = <CALayer: 0x600003d30ce0>; contentOffset: {0, 0}; contentSize: {374, 192}; adjustedContentInset: {0, 0, 0, 0}>])
            print("The subviews: \(String(describing: self.view?.subviews))")
            textView.removeFromSuperview()
            view?.presentScene(SKScene(fileNamed: "GameScene"))
        }
    }
}
导入UIKit
进口SpriteKit
类InputScene:游戏场景,UITextViewDelegate{
var textView:UITextView{
意志{
//将设置子视图:可选([])
//将设置子视图:可选([])
打印(“将设置子视图:\(self.view?.subview)”)
回来
}
}
var transLabel=SKLabelNode(文本:“转到游戏场景”)
覆盖func didMove(到视图:SKView){
//设置文本视图
背景颜色=白色
textView=UITextView(帧:CGRect(x:150,y:0,宽度:self.size.width-40,高度:200))
textView.center=CGPoint(x:self.size.width/2,y:self.size.height/3)
textView.backgroundColor=UIColor.red
//添加子视图并显示它已被添加
self.view?.addSubview(文本视图)
//第一次打印self.view。
//子视图:[]
//子视图:[,]
打印(“子视图:\(view.subviews)”)
//添加转移标签
transLabel.position=CGPoint(x:size.width/2,y:size.height/2)
transLabel.fontColor=UIColor.black
addChild(transLabel)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
保护让触摸=触摸。首先触摸{
回来
}
如果transLabel.contains(触摸位置(in:self)){
self.textView.removeFromSuperview()
self.textView.ishiden=true
//打印textView的superview
//textView的超级视图:nil
打印(“textView的superview:\(字符串(描述:textView.superview)))
//第二次打印self.view的子视图。
//self.view的子视图仍然包含textView
//子视图:可选([])
打印(“子视图:\(字符串(描述:self.view?.subview)))
textView.removeFromSuperview()
查看?.presentScene(SKScene(文件名为:“游戏场景”))
}
}
}
打印的“子视图”加倍的问题是,当呈现场景时,didMoveToView会触发两次。这是因为Xcode先设置场景的虚拟版本,然后设置真实场景。它不会导致任何错误

我试图将textView设置为弱,但它根本没有出现

即使我没有查看?.presentScene(SKScene(文件名:“GameSene”)),文本视图仍然无法删除。我尝试将InputScene设置为SKScene的子类,但不是GameSene的子类,但这没有帮助


我试着用touchesbeent方法打印textView的描述,结果是self.views的子视图不是预期的“textView”

您没有解释的是如何出现两种文本视图。显然有两种文本视图,因为我们可以在这些日志中看到:

// The subviews: [<UITextView: 0x7fbe3984f600 ....
// The subviews: Optional([<UITextView: 0x7fc60b8a9000....

现在,第二次这样做时,您将有效地将第一个文本视图从其作为
textView
引用的位置弹出,并将其替换为第二个文本视图。那么现在,您怎么能告诉第一个文本视图从SuperView()中删除
呢?请记住,
textView
不再引用它。告诉
textView
多次
removeFromSuperview(),基于此,您可以决定是否需要添加它

首先将textView声明为nil-

var textView: UITextView?
然后你可以打电话

if textView != nil{
    textView = UITextView(frame: CGRect(x: 150, y: 0, width: self.size.width-40, height: 200))
    textView.center = CGPoint(x: self.size.width/2, y: self.size.height/3)
    textView.backgroundColor = UIColor.red

    // Add subview and show that it has been added
    self.view?.addSubview(textView)
}
编辑

我刚刚对您的代码进行了一些处理,我想我已经找到了问题的原因。 可悲的是,我不是SpriteKit专家,所以我们必须等待一个解决方案,因为现在我正在定义问题

简而言之-
view?.presentScene(SKScene(文件名为:“GameSecene”)
重新渲染游戏场景

以下是我所做的-

我在类中设置了一个计数器来跟踪didMove函数,但每次点击后都会重置计数器-每次presentScene调用

然后我添加了一个必需的init来跟踪它,结果是presentScene/(点击)导致必需的init再次运行,所以调用presentScene时整个类都被重新加载

重要的是,当我在类的作用域之外定义计数器时,他保持了正常的跟踪,这加强了上述内容

在您的例子中,它只是在删除textview后立即添加它——检查它是否为nil没有帮助,因为它是nil——类再次重新加载

发射时-
轻敲一下-

您添加的内容是否超出了您的想象?也许你正在删除textView,但是,你在意外事件中创建了3个textView,并且只删除了最后1个,使它看起来只有1个,并且没有被删除。我让它在控制台中打印了两次self.view的子视图,子视图中唯一的一个就是textView。是的,让我们看看你是如何做到的。向我们证明,在整个代码中,您已经正确地完成了它。这就是我们将发现您的问题的地方。我修改了代码以指示注释中的两条打印语句。第一条在didMoveTo中,第二条在Touches中。Begani已经尝试过,但没有任何更改。不管怎样,谢谢你的帮助。很抱歉,即使我不去游戏场景,textView仍然不能使用
if textView != nil{
    textView = UITextView(frame: CGRect(x: 150, y: 0, width: self.size.width-40, height: 200))
    textView.center = CGPoint(x: self.size.width/2, y: self.size.height/3)
    textView.backgroundColor = UIColor.red

    // Add subview and show that it has been added
    self.view?.addSubview(textView)
}