什么会导致我的 segue 无限循环?
What would cause my segue to infinitely loop?
我已经实现了一个倒计时计时器,如果用户没有 select 任何选项,它会自动启动我的应用程序。当计时器归零时,我使它无效并触发 performSegueWithIdentifier
,这让我进入了我想要的视图。
那时一切都很好......好吧,有点。我确实注意到我的视图触发了两次,但之后就没问题了。在这一点上,如果我离开该视图,然后再次返回,我的 segue 会触发并且视图会一遍又一遍地加载,直到我停止我的应用程序。
我的输出window显示:
2015-05-13 21:20:26.880 Web App Browser[43407:7957566] Unbalanced
calls to begin/end appearance transitions for
. 2015-05-13
21:20:28.825 Web App Browser[43407:7957566] Unbalanced calls to
begin/end appearance transitions for .
这是我的视图控制器:
class StartViewController: UIViewController {
var countDown = Bool()
var timer = NSTimer()
var count = 5
@IBOutlet weak var countdownLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
countDown = AppDelegate().userDefaults.valueForKey("Auto Start") as! Bool
if countDown == true {
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
} else {
countdownLabel.text = ""
}
}
func update() {
countdownLabel.text = "\(count)"
if count == 0 {
timer.invalidate()
self.performSegueWithIdentifier("toWeb", sender: nil)
} else {
count--
}
}
}
我的故事板:
在下图中,您可以看到我的 selected segue,它将用户从开始屏幕带到一个具有嵌入式 viewController 的导航控制器。您会注意到我已将标识符添加为 "toWeb".
我的问题:
什么会导致我的 segue 无限循环?
不确定这是否与您的问题直接相关,但您声明了两次计时器,一次在本地,一次在 class 范围内。
var countDown = Bool()
var timer = NSTimer()
var count = 5
@IBOutlet weak var countdownLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
countDown = AppDelegate().userDefaults.valueForKey("Auto Start") as! Bool
if countDown == true {
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
} else {
countdownLabel.text = ""
}
}
您看到 var timer = NSTimer() 在 class 范围内创建了一个计时器
var timer = NSTimer.scheduleTimerWithTimeInterval... 在 viewDidLoad 的范围内创建一个新的计时器。我认为应该只是 timer = NSTimer.scheduleTimer...
我想这很明显,但我的更新每秒都会被调用...因为我告诉它了。我把我的 performSegueWithIdentifier
放在里面。所以,很容易修复。
var segueFlag = false
func update() {
countdownLabel.text = "\(count)"
if count == 0 {
timer.invalidate()
if segueFlag == false {
self.performSegueWithIdentifier("toWeb", sender: nil)
segueFlag = true
}
} else {
count--
}
}
我已经实现了一个倒计时计时器,如果用户没有 select 任何选项,它会自动启动我的应用程序。当计时器归零时,我使它无效并触发 performSegueWithIdentifier
,这让我进入了我想要的视图。
那时一切都很好......好吧,有点。我确实注意到我的视图触发了两次,但之后就没问题了。在这一点上,如果我离开该视图,然后再次返回,我的 segue 会触发并且视图会一遍又一遍地加载,直到我停止我的应用程序。
我的输出window显示:
2015-05-13 21:20:26.880 Web App Browser[43407:7957566] Unbalanced calls to begin/end appearance transitions for . 2015-05-13 21:20:28.825 Web App Browser[43407:7957566] Unbalanced calls to begin/end appearance transitions for .
这是我的视图控制器:
class StartViewController: UIViewController {
var countDown = Bool()
var timer = NSTimer()
var count = 5
@IBOutlet weak var countdownLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
countDown = AppDelegate().userDefaults.valueForKey("Auto Start") as! Bool
if countDown == true {
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
} else {
countdownLabel.text = ""
}
}
func update() {
countdownLabel.text = "\(count)"
if count == 0 {
timer.invalidate()
self.performSegueWithIdentifier("toWeb", sender: nil)
} else {
count--
}
}
}
我的故事板:
在下图中,您可以看到我的 selected segue,它将用户从开始屏幕带到一个具有嵌入式 viewController 的导航控制器。您会注意到我已将标识符添加为 "toWeb".
我的问题:
什么会导致我的 segue 无限循环?
不确定这是否与您的问题直接相关,但您声明了两次计时器,一次在本地,一次在 class 范围内。
var countDown = Bool()
var timer = NSTimer()
var count = 5
@IBOutlet weak var countdownLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
countDown = AppDelegate().userDefaults.valueForKey("Auto Start") as! Bool
if countDown == true {
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
} else {
countdownLabel.text = ""
}
}
您看到 var timer = NSTimer() 在 class 范围内创建了一个计时器
var timer = NSTimer.scheduleTimerWithTimeInterval... 在 viewDidLoad 的范围内创建一个新的计时器。我认为应该只是 timer = NSTimer.scheduleTimer...
我想这很明显,但我的更新每秒都会被调用...因为我告诉它了。我把我的 performSegueWithIdentifier
放在里面。所以,很容易修复。
var segueFlag = false
func update() {
countdownLabel.text = "\(count)"
if count == 0 {
timer.invalidate()
if segueFlag == false {
self.performSegueWithIdentifier("toWeb", sender: nil)
segueFlag = true
}
} else {
count--
}
}