我是swift和ios编程的新手。我正在尝试在我的应用程序首次加载时显示模态视图。我遇到的问题是我的模态一直在反复出现。不知道我哪里出错了。
奖金问题:最终,我希望这只会在用户首次打开应用时发生。
class ViewController: UIViewController {
var introModalDidDisplay = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
showIntroModal()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func showIntroModal() {
if (!introModalDidDisplay) {
println(introModalDidDisplay)
introModalDidDisplay = true
let intro = self.storyboard?.instantiateViewControllerWithIdentifier("introModal") as IntroModalViewController
intro.modalPresentationStyle = UIModalPresentationStyle.FormSheet
self.presentViewController(intro, animated: true, completion: nil)
}
}
}
答案 0 :(得分:4)
找到它。我的"介绍"课程正在延长ViewController
而不是UIViewController
......显然这很糟糕。谢谢您的帮助!对不起野鹅追逐。
答案 1 :(得分:0)
关闭模态视图后,再次显示ViewController
视图,再次触发viewDidAppear
并进入显示模态视图的无限循环,因为第一个视图始终显示"出现& #34;
我建议在viewDidLoad
中执行此操作,因为视图应该只加载一次。尝试并试验这些事件,看看它们何时被解雇。
至于一次点火我建议在localStorage(plist)中设置一个标志,指示用户是否第一次打开应用程序。例如,在第一个视图中viewDidLoad
设置一个标志,如果该标志为false,则显示模态视图并将标志设置为true。
以下是关于在Swift中写下帖子的问题:Save Data to .plist File in Swift
答案 2 :(得分:0)
有几点意见:
你是说你在使用应用程序时一次又一次地出现吗?这表明您实例化了此视图控制器的多个实例。例如,你可能正在做一个segue回到这个视图控制器(它将创建新实例)而不是展开/弹出/解除它(它将返回到前一个实例)。
我建议你在viewDidLoad
中有一个断点或日志记录声明,并确认你只看过一次。如果您多次看到它,这意味着您在故事板场景中有一些循环引用(而且,BTW,您正在放弃记忆,一种泄漏)。
要处理此问题,只需在应用程序之间使用一次,您需要将此introModalDidDisplay
保存在某种形式的持久存储中。通常NSUserDefaults
用于此目的。例如,定义introModalDidDisplay
以查找标准用户默认值中的状态:
var introModalDidDisplay = NSUserDefaults.standardUserDefaults().boolForKey("introModalDidDisplay")
然后您的showIntroModal可以在用户默认值中更新此设置:
func showIntroModal() {
if !introModalDidDisplay {
introModalDidDisplay = true
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "introModalDidDisplay")
NSUserDefaults.standardUserDefaults().synchronize()
let intro = self.storyboard?.instantiateViewControllerWithIdentifier("introModal") as IntroModalViewController
intro.modalPresentationStyle = UIModalPresentationStyle.FormSheet
self.presentViewController(intro, animated: true, completion: nil)
}
}
显然,你可以使用你想要的任何持久存储技术(plist,archive,用户默认值,Core Data,SQLite),但想法是一样的:从持久存储中检索状态,一旦介绍了介绍屏幕,相应地更新持久存储。
顺便说一下,通过在持久存储中查找,我们还修复了我在第1点讨论的问题的症状。但是你真的想要解决第一点的根本原因,因为否则你会泄漏内存(当然,如果你实际上是在实例化ViewController
类的多个副本)。
顺便说一下,展望未来,我可能会建议存储一个版本号标识符,而不是只存储一个布尔值。这样,当您发布应用版本2.0时,您将能够决定v1.0用户是否可能再次看到更新的介绍屏幕(或者可能是专注于新内容的自定义屏幕)。