繁体   English   中英

在Swift 3.0中创建AppDelegate后,后退按钮消失

[英]Back button disappears after creating AppDelegate in Swift 3.0

我在xcode 8 swift 3.0中创建了以下结构。

在添加AppDelegate代码之前。 在应用,应用代表和配置文件控制器上,后退按钮仍然可以正常显示。

我使用segue打开页面。

但是,当我将AppDelegate代码添加到“主页”和“登录”控制器中后,“后退”按钮在“ 应用”,“代表代理配置文件”控制器页面上消失了。

有人可以帮忙或解释为什么会这样吗? 如何在申请,申请代表和个人资料页面上启用后退按钮?

谢谢。

在此处输入图片说明

迅捷

import UIKit
class ViewController: UIViewController {

    @IBOutlet var staffNumberLbl: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        staffNumberLbl.text = UserDefaults.standard.object(forKey: "login") as? String

    }
    override func viewDidAppear(_ animated: Bool) {
        let isUserLoggedIn = UserDefaults.standard.bool(forKey: "loggedIn")
        if(!isUserLoggedIn){
            self.performSegue(withIdentifier: "loginview", sender: self)
        }
    }

    @IBAction func logoutData(_ sender: Any) {
        UserDefaults.standard.set(false, forKey: "loggedIn")
        UserDefaults.standard.synchronize();
        let loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginViewController
        appDelegate.window?.makeKeyAndVisible()
    }
}

Login.swift

import UIKit

class LoginViewController: UIViewController {
    @IBOutlet var loginlbl: UITextField!
    @IBOutlet var passlbl: UITextField!
    @IBOutlet var login_button: UIButton!

    var login: String!
    var pw: String!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func loginData(_ sender: Any) {

        login = loginLbl.text
        pw = passLbl.text

        if(login == "" || pw == ""){
            return
        }
        else{
            let url     = URL(string: "http://localhost/login.php")
            let session = URLSession.shared
            let request = NSMutableURLRequest(url: url! as URL)
            request.httpMethod = "POST"

            let LoginDataToPost = "login=\(login!)&pw=\(pw!)"
            request.httpBody    = LoginDataToPost.data(using: String.Encoding.utf8)

            let task = session.dataTask(with: request as URLRequest, completionHandler: {
                (data, response, error) in
                if error != nil {
                    return
                }
                else {
                    do {
                        if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String]
                        {
                            DispatchQueue.main.async
                                {
                                    let message = Int(json["message"]!)
                                    let login   = json["login"]

                                    if(message == 1) {
                                        UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
                                        UserDefaults.standard.set(login, forKey: "login")
                                        UserDefaults.standard.synchronize();
                                        self.dismiss(animated: true, completion: nil)
                                        let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController

                                        let appDelegate = UIApplication.shared.delegate as! AppDelegate
                                        appDelegate.window?.rootViewController = myViewController
                                        appDelegate.window?.makeKeyAndVisible()

                                        print("Value for login is : \(login!)")

                                        return
                                    }
                                    else {}
                            }  
                        }  
                        else {}
                    }
                    catch let jsonParse {}
                }
            })
            task.resume()
        }
    } 
}

AppDelegate.swift

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        let mainStoryBoard: UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

        let isUserLoggedIn:Bool = UserDefaults.standard.bool(forKey: "isUserLoggedIn")
        if(!isUserLoggedIn) {

            let loginViewController = mainStoryBoard.instantiateViewController(withIdentifier: "loginview") as! LoginViewController
            window!.rootViewController = loginViewController
            window!.makeKeyAndVisible()
        }
        else {
            let homePage = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            window!.rootViewController = homePage
            window!.makeKeyAndVisible()
        }
        return true
    }
}

您在设置rootviewcontroller时没有在logoutDataloginData函数中嵌入导航控制器。

使用此代码:

let navigationController = UINavigationController.init(rootViewController: myViewController)
appDelegate.window?.rootViewController = navigationController

在AppDelegate中使用以下代码:

if(!isUserLoggedIn) {

    let loginViewController = mainStoryBoard.instantiateViewController(withIdentifier: "loginview") as! LoginViewController
    let navigationController = UINavigationController.init(rootViewController: loginViewController)
    appDelegate.window?.rootViewController = navigationController
    window!.makeKeyAndVisible()
}
else {
     let homePage = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
     let navigationController = UINavigationController.init(rootViewController: homePage)
     appDelegate.window?.rootViewController = navigationController
     window!.makeKeyAndVisible()
}

成功登录后,尝试使NavigationController成为rootViewController而不是您的ViewController

您的后退按钮将开始出现。

在AppDelegate中,在else块中,代替此行

让homePage = mainStoryBoard.instantiateViewController(withIdentifier:“ ViewController”)为! ViewController

写这个

让homePage = mainStoryBoard.instantiateViewController(withIdentifier:“ NavigationController”)为! UINavigationController

在LoginViewController内部,在块if(message == 1)中

更换

让myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier:“ ViewController”)为! ViewController

让navController:UINavigationController = self.storyboard!.instantiateViewController(withIdentifier:“ NavigationController”)为! UINavigationController

还将故事板上的UINavigationController的故事板标识符设置为NavigationController

从Home.swift中删除它,

let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginViewController
        appDelegate.window?.makeKeyAndVisible()

因为它不继承导航控制器的属性

并将其添加到Appdelegate.swift文件中

对于其他3个ViewController,您需要在eachSegway之间添加Navigation控制器,以便继承它或通过分别实例化ViewController来编码按钮

根据您的配置:

self.navigationItem.hidesBackButton = YES;

要么:

self.navigationController.navigationItem.hidesBackButton = YES;

或者,如果您只想禁用按钮而不隐藏它,则可以使用它。

self.navigationController.navigationItem.backBarButtonItem.enabled = NO;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM