![](/img/trans.png)
[英]Change UINavigationBar back button text and font from AppDelegate using Swift
[英]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时没有在logoutData
和loginData
函数中嵌入导航控制器。
使用此代码:
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.