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

Posted

技术标签:

【中文标题】在 Swift 3.0 中创建 AppDelegate 后后退按钮消失【英文标题】:Back button disappears after creating AppDelegate in Swift 3.0 【发布时间】:2017-02-07 06:12:54 【问题描述】:

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

在我添加 AppDelegate 代码之前。 “应用”、“代表应用”和“配置文件”控制器上的后退按钮仍然显示正常。

我使用segue打开页面。

但是在我将 AppDelegate 代码添加到 Homepage 和 Login 控制器后,Apply, Apply 代表profile 控制器页面上的后退按钮消失了。

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

谢谢。

Home.swift

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
    

【问题讨论】:

添加一些代码? 等一下 我有一个问题 - 你想在 appDelegate 中做什么?你的segue表现如何? segue 的目标控制器是什么? 我已经更新了我的问题。请参考我上面的代码 您将这些控制器设置为 root,因此如果您按下控制器,它不应该有后退按钮,它将再次拥有它。你能告诉我第一个返回按钮在哪里以及它什么时候消失吗? 【参考方案1】:

您在 logoutDataloginData 函数中设置 rootviewcontroller 而不将导航控制器嵌入到它。

使用此代码:

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()

【讨论】:

我很困惑。 .如何嵌入它?仅在两个控制器或家庭控制器上? let appDelegate = UIApplication.shared.delegate as! AppDelegate之后写下我的代码并删除appDelegate.window?.rootViewController = myViewController这一行 您必须在loginData & logoutData 函数中使用此代码。如果有效,请通知我。 目前还不行。也许我错过了一些步骤。 让 loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController 让 appDelegate = UIApplication.shared.delegate 为! AppDelegate let navigationController = UINavigationController.init(rootViewController: loginViewController) appDelegate.window?.rootViewController = navigationController appDelegate.window?.makeKeyAndVisible()【参考方案2】:

从 Home.swift 中删除它,

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

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

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

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

【讨论】:

如果可能的话,你能在你的答案上更新上面的代码吗?谢谢【参考方案3】:

登录成功后,尝试将 NavigationController 设为 rootViewController 而不是你的 ViewController

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

在 AppDelegate 中,在 else 块中,而不是这一行

让 homePage = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") 为!视图控制器

写这个

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

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

替换

让 myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as!视图控制器

让 navController:UINavigationController = self.storyboard!.instantiateViewController(withIdentifier: "NavigationController") as! UINavigationController

还将情节提要中 UINavigationController 的情节提要标识符设置为 NavigationController

【讨论】:

我需要更改哪一行和哪个 swift 文件? 在 AppDelegate 中的 else 块中代替这一行 让 homePage = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController") 为! ViewController 把这个 let homePage = mainStoryBoard.instantiateViewController(withIdentifier: "NavigationController") 写成! UINavigationController 也在 LoginViewController 中,在 if(message == 1) 块中替换 let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") 为! ViewController \n with let navController:UINavigationController = self.storyboard!.instantiateViewController(withIdentifier: "NavigationController") as! UINavigationController 还将情节提要中 UINavigationController 的情节提要标识符设置为 NavigationController 一个错误说“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'不支持推送导航控制器'***首先抛出调用堆栈:” 请查看我的更新答案,并用我的代码替换您发布的原始代码,看看它是否有效【参考方案4】:

取决于您的配置:

self.navigationItem.hidesBackButton = YES;

或者:

self.navigationController.navigationItem.hidesBackButton = YES;

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

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

【讨论】:

@Dude 在 swift 中的问题不是客观的 c

以上是关于在 Swift 3.0 中创建 AppDelegate 后后退按钮消失的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Springdoc 在 OpenAPI 3.0 中创建链接?

如何在 Maven 中创建 Servlet 3.0 Web 应用程序?

如何在 Mapbox iOS SDK 3.0 版中创建自定义图像标记?

如何在 Flash CC/Action Script 3.0 中创建自定义 MovieClip 边界?

在 Extjs 2.3.0 中创建商店实例

如何在 Swift 中创建私有函数? [复制]