迅速!仅在按下按钮时创建一个segue!标签栏控制器

Posted

技术标签:

【中文标题】迅速!仅在按下按钮时创建一个segue!标签栏控制器【英文标题】:Swift! Create a segue only if the button is pressed! Tab Bar Controller 【发布时间】:2015-07-08 15:43:27 【问题描述】:

好的,所以几天来,我一直在纠结这个问题。我有一个标签栏控制器和一个视图控制器,应用程序的用户可以在其中创建或输入他们的密码,我们称之为 “Pass View”

密码是使用 Apple 提供的钥匙串方法创建的。理想情况下,我希望应用程序首先弹出 "Pass View",然后如果用户正确输入密码,则应用程序将转到选项卡栏控制器。

现在我可以将我的输入/创建按钮的动作转场关联到选项卡栏控制器,但如果我这样做,那么即使用户输入错误的密码,转场仍然会发生..

链接到显示 StoryBoard 的图片 1: StoryBoardImage

链接到图片 2 显示文件: files in my project

这是我的代码:

import UIKit

class LoginPassViewController: UIViewController 
    let MyKeychainWrapper = KeychainWrapper()
    let createLoginButtonTag = 0
    let loginButtonTag = 1

    @IBOutlet weak var passTextField: UITextField!
    @IBOutlet weak var loginButton: UIButton!

    override func viewDidLoad() 
        // 1.
        let hasLogin = NSUserDefaults.standardUserDefaults().boolForKey("hasLoginKey")

        // 2.
        if hasLogin 
            loginButton.setTitle("Login", forState: UIControlState.Normal)
            loginButton.tag = loginButtonTag
            loginButton.hidden = false
         else 
            loginButton.setTitle("Create", forState: UIControlState.Normal)
            loginButton.tag = createLoginButtonTag
            loginButton.hidden = false
        

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    @IBAction func enterApp(sender: AnyObject) 
        // 1.
        if passTextField.text == "" 
            var alert = UIAlertView()
            alert.title = "You must enter a password!"
            alert.addButtonWithTitle("Oops!")
            alert.show()
            return
        

        // 2.
        passTextField.resignFirstResponder()

        // 3.
        if sender.tag == createLoginButtonTag 
            // 4.
            let hasLoginKey = NSUserDefaults.standardUserDefaults().boolForKey("hasLoginKey")

            // 5.
            MyKeychainWrapper.mySetObject(passTextField.text, forKey:kSecValueData)
            MyKeychainWrapper.writeToKeychain()
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "hasLoginKey")
            NSUserDefaults.standardUserDefaults().synchronize()
            loginButton.tag = loginButtonTag
         else if sender.tag == loginButtonTag 
            // 6.
            if checkLogin(passTextField.text) 

 // THIS IS WHERE IF THE USER PASSWORD IS CORRECT THEN THE VIEW SHOULD SWITCH // TO THE TAB BAR CONTROLLER. 

             else 
                // 7.
                var alert = UIAlertView()
                alert.title = "Login Problem"
                alert.message = "Wrong username or password."
                alert.addButtonWithTitle("Foiled Again!")
                alert.show()
            
        
    

    func checkLogin(password: String ) -> Bool 
        if password == MyKeychainWrapper.myObjectForKey("v_Data") as? String 
                return true
         else 
            return false
        
    

【问题讨论】:

【参考方案1】:

只是不要以编程方式创建 segue,但您可以控制 segue 的执行。给他们唯一的标识符,然后覆盖这些方法:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool 
     //depend on the situation, you can decide to perform this segue or not


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    //prepare datas before go to next viewcontroller

【讨论】:

以上是关于迅速!仅在按下按钮时创建一个segue!标签栏控制器的主要内容,如果未能解决你的问题,请参考以下文章

执行 segue 后,文本字段永久位于标签中

按下网页按钮时更改iOS标签栏项目名称

如何仅在按下按钮时更新位置

标签栏控制器/ Segue问题

WPF Focused Visual State 仅在按下按钮时才会启动,为啥?

添加 TabBar 元素