it-swarm-tr.com

IOS - Hızlı kullanarak programsal olarak nasıl yararlanılır

Kullanıcıları doğrulamak için Facebook SDK kullanan bir uygulama oluşturuyorum. Facebook mantığını ayrı bir sınıfta birleştirmeye çalışıyorum. İşte kod (basitlik için elimden):

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???
        }
    }
}

Oturum durumu değişikliklerini kontrol etmek için yukarıdaki sınıf yöntemini kullanıyorum ve iyi çalışıyor.

Q: Kullanıcı verisine sahip olduğumda, bu özel sınıf içinden bir sonraki görünüme nasıl gidebilirim?

EDIT: açık olmak gerekirse, film şeridinde kimliğe sahip bir kimliğim var ve görüntüleme denetleyicisi olmayan bir sınıftan bir sekme gerçekleştirmenin bir yolunu bulmaya çalışıyorum.

172
Shlomi Schwartz

Öbürünüz film şeridinde iki görünümünüz arasında bir belirteç tanımlayıcısı varsa varsa, programlı olarak şunu kullanarak çağırabilirsiniz:

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

Daha eski sürümler için:

performSegueWithIdentifier("mySegueID", sender: nil)

Ayrıca şunları da yapabilirsiniz:

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

Veya bir Navigasyon kontrol cihazındaysanız:

self.navigationController?.pushViewController(nextViewController, animated: true)
314
Jérôme Leducq

NSNotification kullanabilirsiniz.

Özel sınıfınıza bir gönderi yöntemi ekleyin:

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

ViewController'ınıza bir gözlemci ekleyin:

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

Size fonksiyon ekleyin ViewController:

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

Hikayeniz film şeridinde iki görünümünüz arasında bir dilekçe tanıtıcısı varsa, programlı olarak

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

Navigasyon kontrol cihazındaysanız

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

Gezinti denetleyicisini kullanarak ikinci yaklaşım için önereceğim.

14
Manish Mahajan

Bu şekilde bir segue kullanabilirsiniz:

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

    }
}
14
Ricky

Swift - SpriteKit ile de çalışır

NSNotification kullanabilirsiniz.

Örnek:

1.) Film şeridinde bir hedef oluşturun ve "segue" tanımlayıcısını adlandırın

2.) İstediğiniz ViewController'da bir fonksiyon oluşturun.

func goToDifferentView() {

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

}

3.) ViewController'ınızın ViewDidLoad () bölümünde, gözlemciyi oluşturmaktan kaçınıyorsunuz.

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

pdate - Bunu en son kullandığımda, hataları susturmak için .addObserver çağrısını aşağıdaki koda değiştirmek zorunda kaldım.

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

4.) İstediğiniz ViewController veya Scene'de, sorgunun tetiklenmesini istediğiniz yere Post Metodunu ekleyin.

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)

pdate - Bunu en son kullandığımda, hataları susturmak için .post çağrısını aşağıdaki koda değiştirmek zorunda kaldım.

NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)
12
Timmy Sorensen

Birim testi yapmak istediğiniz şey gerçekten önemlidir. Temel olarak görünüm denetleyicide küçük bir yerel işlev oluşturmanız gerekir. İşleve bir şey verin, performSegueWithIndentifier ekleyin.

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

Ardından, işlev sınıfınızı FBManager, bir işlev argümanı alan bir başlatıcı ve sorguyu gerçekleştiren ViewController işlevini tutmak için bir değişkeni içerecek şekilde değiştirin.

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")
    }
}

(Rahatlık girişi, bunu, sorguyu gerçekleştirmeden birim testinde kullanmanıza izin verir.)

Son olarak,/todo: bir sonraki görünüme segue in nerede ???, satırları boyunca bir şeyler koy:

self.yourFunction()

Birim testlerinizde bunu basitçe şu şekilde kullanabilirsiniz:

let f = UtilClass()
f.doThatThing()

doThatThing sizin fbsessionstatechange ve UtilClass FBManager.

Gerçek kodunuz için, sadece localFunc (parantez yok) FBManager sınıfına iletin.

2
Bill

Bu şeyi performSegueWithIdentifier işlevini kullanarak yapabilirsiniz.

Screenshot

Sözdizimi:

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

Örnek:

 performSegueWithIdentifier("homeScreenVC", sender: nil)
1
Jayprakash Dubey

Bu benim için çalıştı.

Her şeyden önce, storyboard'unuzdaki görüntü denetleyicisine kimlik denetçisinin içinde bir Storyboard Kimliği verin. Ardından, aşağıdaki örnek kodu kullanın (sınıfın, storyboard adının ve storyboard kimliğinin, kullandıklarınızla eşleşmesini sağlayın):

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)

Daha fazla ayrıntı için bkz http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html iyi dilekler

1
amdan