我刚刚开始学习如何开发iOS应用程序。 (请注意,我正在使用XCode 6 beta和Swift)我认为我自己构建接口很好,但我似乎遇到了segue问题。
我的应用程序的第一页只是一个简单的屏幕,带有注册按钮和登录按钮。我为注册页面创建了一个单独的视图控制器,并在其上放置了一个文本字段。这两个视图控制器都在我的故事板中。然后我创建了一个自定义segue类来简单地为起始页面设置动画,然后向左移动一个屏幕的注册页面,以便现在显示注册页面。这是我的自定义segue类:
class SlideFromRightSegue: UIStoryboardSegue {
override func perform() {
let screenWidth = UIScreen.mainScreen().bounds.width
let center = self.sourceViewController.view!.center
UIView.animateWithDuration(0.25,
animations: {
self.sourceViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
self.destinationViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
}, completion: { (finished: Bool) in
self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
})
}
}
我根据我发现的教程来做这个,我不认为这里有问题。我只是将源VC和目标VC的中心设置为左侧的一个屏幕。我不完全确定iOS中的动画是如何工作的,但是我发现的教程结构相似,所以我假设关闭进入了动画"调用参数,然后iOS生成其间的所有步骤,并将每个帧绘制到屏幕上。 (如果我错了,请纠正我)
所以我有一个自定义的segue。我回到我的故事板,点击注册按钮,转到连接选项卡,然后拖动"触发的段 - 动作"到第二个VC,选择" custom"然后选择我的自定义类。出于某种原因,它不是仅仅是幻灯片,而是#34;它是" _TtC524SlideFromRightSegue"。我不确定为什么会这样,但我认为这与我重新命名segue类的事实有关,我希望这不会造成任何问题。无论如何,这样做会创建一个从第一个VC到第二个VC的箭头,所以我认为它有效。
当我运行应用程序时,我会像往常一样获得启动屏幕。我点击注册按钮,没有任何反应。可能有一些我错过了,但我在segue的perform()函数中放置了一个断点,在第一个VC的prepareForSegue()函数中放了一个断点。两个都没有被触发。我认为我已经正确设置了segue,我在应用程序中实际执行时遇到了问题。任何人都知道发生了什么事?
答案 0 :(得分:1)
我不知道为什么你的执行方法没有被调用,但它不是由于你的代码,尽管代码确实存在一些问题。您永远不会将目标视图控制器的视图添加到窗口中(直到演示文稿将为您完成此操作的完成)。因此,您需要添加视图,将其放在屏幕右侧,然后让它最终居中,而不是像您在代码中那样离开屏幕,
class SlideFromRightSegue: UIStoryboardSegue {
override func perform() {
let screenWidth = UIScreen.mainScreen().bounds.width
let center = self.sourceViewController.view!.center
let appdel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
appdel.window!.addSubview(self.destinationViewController.view)
self.destinationViewController.view!.center = CGPoint(x: center.x + screenWidth, y: center.y)
UIView.animateWithDuration(0.25,
animations: {
self.sourceViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
self.destinationViewController.view!.center = center
}, completion: { (finished: Bool) in
self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
self.sourceViewController.view!.removeFromSuperview()
})
}
}
答案 1 :(得分:1)
所以,事实证明,问题在于我使用的是自定义按钮类,它覆盖了touchesBegan,touchesEnded和touchesCancelled函数。那些覆盖没有回调超类方法,因此按下按钮的动作甚至没有被触发。
我想我可以从这一切中得到的教训是确保知道哪个函数覆盖必须回调超类,哪个应该完全覆盖超类。触摸事件处理程序可能需要回调超类。