在 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】:您在 logoutData
和 loginData
函数中设置 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 版中创建自定义图像标记?