Swift 4:导航控制器不需要的循环
Swift 4: Navigation Controller unwanted looping
我有以下代码:
import UIKit
import FacebookLogin
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if AccessToken.current != nil {
// Already logged-in
// Redirect to Home View Controller
goToHome()
}
// Add LoginButton
let loginButton = FBLoginButton(permissions: [ .publicProfile, .email, .userFriends ])
let screenSize:CGRect = UIScreen.main.bounds
let screenHeight = screenSize.height // real screen height
//let's suppose we want to have 10 points bottom margin
let newCenterY = screenHeight - loginButton.frame.height - 20
let newCenter = CGPoint(x: view.center.x, y: newCenterY)
loginButton.center = newCenter
view.addSubview(loginButton)
// Triggered after every successfully login / logout
NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
if AccessToken.current != nil {
// Successfully just Logged in
// Redirect to Home View Controller
self?.goToHome()
} else {
// Successfully just Logged out
}
}
}
func goToHome() {
let storyboard = UIStoryboard(name: "HomeAfterLogIn", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeAfterLogInViewController") // I called mine like that (check screenshot below)
self.navigationController?.pushViewController(vc, animated: true)
}
}
此代码允许用户使用 Facebook SDK 登录我的应用程序。 LaunchScreen.storyboard如下:
然后导致 Main.storyboard,它看起来像这样:
如果用户登录成功,他们将被带到HomeAfterLogIn.storyboard,如下所示:
但是,一旦用户登录,此页面就会持续加载,即用户成功登录,显示 "Logged In" 标签,然后一遍又一遍地重新加载,而我只是想让它加载一次。如果用户之前登录过,页面只会加载一次,即下面的代码:
if AccessToken.current != nil {
// Already logged-in
// Redirect to Home View Controller
goToHome()
}
但是如果用户是新用户/第一次使用,它会循环所以我认为错误在这里:
// Triggered after every successfully login / logout
NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
if AccessToken.current != nil {
// Successfully just Logged in
// Redirect to Home View Controller
self?.goToHome()
} else {
// Successfully just Logged out
}
}
嘿,这里有一些类似的代码,希望对您有所帮助:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let signedIn = UserDefaults.standard.bool(forKey: "signedIn")
if(signedIn) {
let HomeVC2 = storyboard.instantiateViewController(withIdentifier: "HomeTabBarController")
self.window?.rootViewController = HomeVC2
} else {
let signInVC = storyboard.instantiateViewController(withIdentifier: "EntryVC")
self.window?.rootViewController = signInVC
}
return true
}
我看到你有一些几乎相同的东西,但看起来在这个结构中添加 "if" "else" "return" 可能会解决问题。当然,我使用 Firebase 作为我的身份验证,所以结构可能不同。
你是说一直弹出同一个画面?即使在您点击进入下一个 VC 之后?故事板上的某些内容可能会把它搞砸,但如果您有更多详细信息,请告诉我。希望这有帮助!祝你好运!
我可以从你最后的截图中看到,你在 storyboard
中为 HomeAfterLogInViewController 设置了 Custom Class class 属性到 ViewController
这意味着您正在将 HomeAfterLogInViewController 的 UI 与 ViewController.swift
链接起来,看起来您处于循环中。
每个故事板 UI ViewController 必须链接到一个 swift class 代表特定的 ViewController 逻辑。
这意味着在您最后的屏幕截图中,您在右侧看到的 Custom Class 将 ViewController 替换为 HomeAfterLogInViewController
(应该是与 HomeAfterLogInViewController.swift
)
相同的文件名
我有以下代码:
import UIKit
import FacebookLogin
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if AccessToken.current != nil {
// Already logged-in
// Redirect to Home View Controller
goToHome()
}
// Add LoginButton
let loginButton = FBLoginButton(permissions: [ .publicProfile, .email, .userFriends ])
let screenSize:CGRect = UIScreen.main.bounds
let screenHeight = screenSize.height // real screen height
//let's suppose we want to have 10 points bottom margin
let newCenterY = screenHeight - loginButton.frame.height - 20
let newCenter = CGPoint(x: view.center.x, y: newCenterY)
loginButton.center = newCenter
view.addSubview(loginButton)
// Triggered after every successfully login / logout
NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
if AccessToken.current != nil {
// Successfully just Logged in
// Redirect to Home View Controller
self?.goToHome()
} else {
// Successfully just Logged out
}
}
}
func goToHome() {
let storyboard = UIStoryboard(name: "HomeAfterLogIn", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "HomeAfterLogInViewController") // I called mine like that (check screenshot below)
self.navigationController?.pushViewController(vc, animated: true)
}
}
此代码允许用户使用 Facebook SDK 登录我的应用程序。 LaunchScreen.storyboard如下:
然后导致 Main.storyboard,它看起来像这样:
如果用户登录成功,他们将被带到HomeAfterLogIn.storyboard,如下所示:
但是,一旦用户登录,此页面就会持续加载,即用户成功登录,显示 "Logged In" 标签,然后一遍又一遍地重新加载,而我只是想让它加载一次。如果用户之前登录过,页面只会加载一次,即下面的代码:
if AccessToken.current != nil {
// Already logged-in
// Redirect to Home View Controller
goToHome()
}
但是如果用户是新用户/第一次使用,它会循环所以我认为错误在这里:
// Triggered after every successfully login / logout
NotificationCenter.default.addObserver(forName: .AccessTokenDidChange, object: nil, queue: OperationQueue.main) { [weak self] _ in
if AccessToken.current != nil {
// Successfully just Logged in
// Redirect to Home View Controller
self?.goToHome()
} else {
// Successfully just Logged out
}
}
嘿,这里有一些类似的代码,希望对您有所帮助:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let signedIn = UserDefaults.standard.bool(forKey: "signedIn")
if(signedIn) {
let HomeVC2 = storyboard.instantiateViewController(withIdentifier: "HomeTabBarController")
self.window?.rootViewController = HomeVC2
} else {
let signInVC = storyboard.instantiateViewController(withIdentifier: "EntryVC")
self.window?.rootViewController = signInVC
}
return true
}
我看到你有一些几乎相同的东西,但看起来在这个结构中添加 "if" "else" "return" 可能会解决问题。当然,我使用 Firebase 作为我的身份验证,所以结构可能不同。
你是说一直弹出同一个画面?即使在您点击进入下一个 VC 之后?故事板上的某些内容可能会把它搞砸,但如果您有更多详细信息,请告诉我。希望这有帮助!祝你好运!
我可以从你最后的截图中看到,你在 storyboard
中为 HomeAfterLogInViewController 设置了 Custom Class class 属性到 ViewController
这意味着您正在将 HomeAfterLogInViewController 的 UI 与 ViewController.swift
链接起来,看起来您处于循环中。
每个故事板 UI ViewController 必须链接到一个 swift class 代表特定的 ViewController 逻辑。
这意味着在您最后的屏幕截图中,您在右侧看到的 Custom Class 将 ViewController 替换为 HomeAfterLogInViewController
(应该是与 HomeAfterLogInViewController.swift
)