用swift在viewdid中显示一个模态

时间:2014-10-15 18:30:56

标签: ios swift

我是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)
        }
    }
}

3 个答案:

答案 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)

有几点意见:

  1. 你是说你在使用应用程序时一次又一次地出现吗?这表明您实例化了此视图控制器的多个实例。例如,你可能正在做一个segue回到这个视图控制器(它将创建新实例)而不是展开/弹出/解除它(它将返回到前一个实例)。

    我建议你在viewDidLoad中有一个断点或日志记录声明,并确认你只看过一次。如果您多次看到它,这意味着您在故事板场景中有一些循环引用(而且,BTW,您正在放弃记忆,一种泄漏)。

  2. 要处理此问题,只需在应用程序之间使用一次,您需要将此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类的多个副本)。


  3. 顺便说一下,展望未来,我可能会建议存储一个版本号标识符,而不是只存储一个布尔值。这样,当您发布应用版本2.0时,您将能够决定v1.0用户是否可能再次看到更新的介绍屏幕(或者可能是专注于新内容的自定义屏幕)。