如何在iOS中使用Swift编程segue

我正在创建一个使用Facebook SDK来验证用户身份的应用程序。我试图在一个单独的课上巩固facebook逻辑。下面是代码(为了简单起见,去掉了):

import Foundation


class FBManager {
class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){
//... handling all session states
FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
        

println("Logged in user: \n\(result)");
        

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController
        

loggedInView.result = result;
        

//todo: segue to the next view???
}
}
}

我正在使用上面的类方法来检查会话状态的变化,它工作得很好。

一旦我有了用户的数据,我如何从这个自定义类中segue到下一个视图?

我在storyboard上有一个带标识符的segue,我试图找到一种方法从一个不是视图控制器的类执行segue

260627 次浏览

如果你的segue存在于故事板中,并且在你的两个视图之间有一个segue标识符,你可以通过编程方式调用它:

performSegue(withIdentifier: "mySegueID", sender: nil)

对于旧版本:

performSegueWithIdentifier("mySegueID", sender: nil)

你还可以:

presentViewController(nextViewController, animated: true, completion: nil)

或者如果你在导航控制器中:

self.navigationController?.pushViewController(nextViewController, animated: true)

你可以像这样使用segue:

self.performSegueWithIdentifier("push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "push" {


}
}

对于单元测试来说,您想要做的事情非常重要。基本上你需要在视图控制器中创建一个小的本地函数。将函数命名为任何名称,只要包括performSegueWithIndentifier

func localFunc() {
println("we asked you to do it")
performSegueWithIdentifier("doIt", sender: self)
}

接下来改变你的实用工具类FBManager,包括一个初始化式,它接受一个函数的参数和一个变量来保存执行segue的ViewController的函数。

public class UtilClass {


var yourFunction : () -> ()


init (someFunction: () -> ()) {
self.yourFunction = someFunction
println("initialized UtilClass")
}


public convenience init() {
func dummyLog () -> () {
println("no action passed")
}
self.init(dummyLog)
}


public func doThatThing() -> () {
// the facebook login function
println("now execute passed function")
self.yourFunction()
println("did that thing")
}
}

(方便的init允许您在单元测试中使用它,而无需执行segue。)

最后,你有//todo: segue到下一个视图??,写一些类似的东西:

self.yourFunction()

在你的单元测试中,你可以简单地调用它:

let f = UtilClass()
f.doThatThing()

doThatThing是你的fbsessionstatechange, UtilClass是FBManager。

对于实际代码,只需将localFunc(没有括号)传递给FBManager类。

你可以使用NSNotification

在自定义类中添加post方法:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

在ViewController中添加一个观察者:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)

在ViewController中添加函数:

func methodOFReceivedNotication(notification: NSNotification){
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}

你可以使用performSegueWithIdentifier函数来做这件事。

截图

语法:

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

例子:

 performSegueWithIdentifier("homeScreenVC", sender: nil)

__abc0 - __abc1

你可以使用NSNotification

例子:

1)。在故事板中创建一个segue并将标识符命名为segue

2)。在你要segue的ViewController中创建一个函数。

func goToDifferentView() {


self.performSegue(withIdentifier: "segue", sender: self)


}

3)。在ViewController的ViewDidLoad()中,你从创建观察者开始segue。

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)
< p > 更新 - 上次使用此方法时,我不得不将.addObserver调用更改为以下代码以消除错误
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

4)。在你要segue到的ViewController或Scene中,在你想要segue被触发的地方添加Post方法。

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)
< p > 更新 - 上次使用此方法时,我不得不将.post调用更改为以下代码以消除错误
NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)

这对我很管用。

首先,在标识检查器中给storyboard中的视图控制器一个storyboard ID。然后使用下面的示例代码(确保类、故事板名称和故事板ID与您正在使用的匹配):

let viewController:
UIViewController = UIStoryboard(
name: "Main", bundle: nil
).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject!
// this must be downcast to utilize it


self.presentViewController(viewController, animated: false, completion: nil)

更多详情见http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html 最好的祝愿< / p >

如果你的segue存在于故事板中并且在你的两个视图之间有一个segue标识符,你可以用编程方式调用它

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

如果你在导航控制器

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)

我会推荐你使用导航控制器的第二次进近。

另一个选择是使用模态segue

到故事板,并给视图控制器一个故事板ID。您可以在右侧的标识检查器中找到更改故事板ID的位置。 让我们称故事板ID为ModalViewController

打开'sender'视图控制器(让我们称其为ViewController)并将此代码添加到其中

public class ViewController {
override func viewDidLoad() {
showModalView()
}


func showModalView() {
if let mvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ModalViewController") as? ModalViewController {
self.present(mvc, animated: true, completion: nil)
}
}
}

注意,我们要打开的视图控制器也被称为ModalViewController

步骤3:关闭ModalViewController,添加这个

public class ModalViewController {
@IBAction func closeThisViewController(_ sender: Any?) {
self.presentingViewController?.dismiss(animated: true, completion: nil)
}
}

这招对我很管用:

//Button method example
@IBAction func LogOutPressed(_ sender: UIBarButtonItem) {


do {
try Auth.auth().signOut()
navigationController?.popToRootViewController(animated: true)


} catch let signOutError as NSError {
print ("Error signing out: %@", signOutError)
}




}

上面已经有了很好的答案,我想把重点放在执行segue之前的准备上。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is YourDestinationVC {
let vc = segue.destination as? YourDestinationVC
// "label" and "friends" are part of destinationVC
vc?.label = "someText"
vc?.friends = ["John","Mike","Garry"]
}
一旦你完成了你想要传递给你的destinationVC的数据,然后在一个合适的地方执行你的segue。 你可以设置“identifierofdestinationvc”;在StoryBoard ID字段

performSegue(withIdentifier: "IdentifierOfDestinationVC", sender: nil)