【问题标题】:Error: UIView's window is not equal to another view's window错误:UIView 的窗口不等于另一个视图的窗口
【发布时间】:2014-10-29 21:49:48
【问题描述】:

我是一名初学者程序员,学习 swift。第一次在这里发帖。

额外信息,但可能是不必要的
在我创建的这个应用程序中,用户在主视图控制器上选择一个图像并将其传递给第二个视图控制器。在那里,图像被分解成碎片,这些碎片被放置在单独的 UIImageViews 中。目标是通过交换图像将它们按正确的顺序排列。

一切正常,在模拟器中运行正常。但是,我正在尝试添加基本动画(移动 UIImageViews),但它们没有执行。我知道我有正确的动画语法,因为我在另一个项目中测试了代码。

主要问题
当我从主视图控制器导航到第二个视图控制器时,控制台中立即出现错误。它是这样说的:

2014-09-04 17:51:33.489 TileGame[79951:95150647] UIView: 0x7f7fe9c84600;帧 = (0 0; 320 568);自动调整大小 = W+H; layer = CALayer: 0x7f7fe9c848d0>> 的窗口不等于 TileGame.GameScreen: 0x7f7fe9dc6bc0> 的视图窗口!

我不知道它是什么意思,但它似乎并没有引起任何问题,除了阻碍动画。有什么想法吗??

看起来这个人也有类似的错误消息,但可能比我的应用程序更复杂。 Modal viewcontroller UI not responsive after presentViewController:animated:completion:

这是我在 GitHub 上的整个项目:https://github.com/pakalewis/Parker-Lewis-CF/tree/master/TileGame

谢谢

【问题讨论】:

  • 解决我类似问题的唯一解决方案是:self.dismiss(animated: true) { self.performSegue(withIdentifier: "showUserTableSegue", sender: self) }

标签: ios xcode uiview swift window


【解决方案1】:

您似乎对 iOS 编程范式有一些根本性的误解。您在按钮上附加了 segue,但您也可以在代码中调用 performSegue。当您将 segue 附加到控件时,您不需要任何代码(也不应该有任何代码)来执行 segue。除了展开转场之外,您也不应该使用转场返回先前的视图控制器;你并没有真正回去,你正在创建一个你认为你要回去的控制器的新实例。这将导致控制器的堆积(因为不会释放任何控制器),直到您的应用程序内存不足。

因此,您应该从 MainScreen 中删除函数letsPlayButton:,并在情节提要中删除它(您只需要附加到该按钮的segue)。

删除你要从GameScreen“返回”到MainScreen的segue,并将backToMainScreen中的代码更改为这个,

@IBAction func backToMainScreen(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }

【讨论】:

  • 成功了。错误消息一定来自于在彼此之上创建多个控制器。我刚开始使用 iOS 的东西和一般的编程,所以这些 segues 让我有些困惑——现在更有意义了。感谢您花时间回答!
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多