IOS - कैसे तेजी से उपयोग करके प्रोग्राम को अलग करना है


185

मैं एक ऐप बना रहा हूं जो उपयोगकर्ताओं को प्रमाणित करने के लिए फेसबुक एसडीके का उपयोग करता है। मैं एक अलग वर्ग में फेसबुक तर्क को मजबूत करने की कोशिश कर रहा हूं। यहाँ कोड (सादगी के लिए छीन लिया गया है):

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

मैं सत्र परिवर्तन की जाँच करने के लिए उपरोक्त वर्ग विधि का उपयोग कर रहा हूँ, और यह ठीक काम करता है।

प्रश्न: एक बार मेरे पास उपयोगकर्ता का डेटा है, तो मैं इस कस्टम वर्ग के भीतर से अगले दृश्य के लिए कैसे बहस कर सकता हूं?

संपादित करें: बस स्पष्ट होने के लिए, मेरे पास स्टोरीबोर्ड पर पहचानकर्ता के साथ एक सेग है, और मैं एक वर्ग से एक सेगमेंट करने का एक तरीका खोजने की कोशिश कर रहा हूं जो दृश्य नियंत्रक नहीं है


2
पसंद है performSegue:?
HAS

हां, लेकिन कोड व्यू कंट्रोलर में नहीं है, मैं इसे कैसे हासिल कर सकता हूं?
श्लोमी श्वार्ट्ज

ठीक है, उस स्थिति में आपको उस कार्य (बहस) को उस वस्तु से सौंपना चाहिए जिसे आप कार्य नियंत्रक (पूर्ण ब्लॉक या एक प्रतिनिधि विधि के माध्यम से) करते हैं।
HAS

एक गैर शून्य लेआउट अपवाद हो रही है
क्रिस हेयस

जवाबों:


340

यदि आपका सेगमेंट आपके दो विचारों के बीच एक सेगमेंट आइडेंटिफ़ायर के साथ स्टोरीबोर्ड में मौजूद है, तो आप इसे प्रोग्रामेटिक रूप से उपयोग कर सकते हैं:

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

पुराने संस्करणों के लिए:

performSegueWithIdentifier("mySegueID", sender: nil)

आप भी कर सकते हैं:

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

या यदि आप एक नेविगेशन नियंत्रक में हैं:

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

7
उत्तर के लिए धन्यवाद, मैं एक कस्टम वर्ग से PerformSegueWithIdentifier को कैसे कह सकता हूं जो दृश्य नहीं है?
श्लोमी श्वार्ट्ज डिस

2
अगर मैं तुम्हारी दूसरी विधि का उपयोग करूं। अगले दृश्य में डेटा कैसे पास करें?
इप्रेम

2
आप func preparationForSegue का उपयोग करेंगे (segue: UIStoryboardSegue, प्रेषक: AnyObject?) और गुण सेट करें।
लॉयड सार्जेंट

1
नोट करते समय PerformSequeWithIdentifer () को कॉल करने के लिए, आपके कॉलिंग कंट्रोलर में readyForSeque () के कार्यान्वयन को बुलाया जाएगा और आप वहां से गुजरने वाले विभिन्न डेटा कर सकते हैं - वास्तव में, readyForSeque () में प्राप्त प्रेषक पैरामीटर बस वही है जो प्रेषक पैरामीटर को पास किया गया है performSequeWithIdentifier ()
टिम्बो

1
अगर स्टोरीबोर्ड में सेगमेंट मौजूद नहीं है तो क्या होगा? उदाहरण के लिए, यदि आप ViewController के लिए एक सेगमेंट बनाना चाहते हैं?
डरावने

20

आप NSNotification का उपयोग कर सकते हैं

अपने कस्टम वर्ग में एक पोस्ट विधि जोड़ें:

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

1
कृपया इस तरह से सूचनाओं का दुरुपयोग न करें। एक प्रतिनिधि का उपयोग करें और दृश्य नियंत्रक और आपकी कक्षा के बीच संबंध स्पष्ट करें। अधिसूचना के नियंत्रण प्रवाह का निरीक्षण करना लगभग असंभव है, क्योंकि कई ग्राहक हो सकते हैं, और उदाहरण इच्छाशक्ति की सदस्यता / सदस्यता समाप्त कर सकते हैं।
uliwitness

17

यदि आपका सेगमेंट आपके दो विचारों के बीच एक सेगमेंट आइडेंटिफ़ायर के साथ स्टोरीबोर्ड में मौजूद है, तो आप इसे प्रोग्रामेटिक रूप से उपयोग करके कॉल कर सकते हैं

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

यदि आप नेविगेशन कंट्रोलर में हैं

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

मैं आपको नेविगेशन कंट्रोलर का उपयोग करके दूसरे दृष्टिकोण के लिए सलाह दूंगा।


self.performSegue (withIdentifier: "yourIdentifierInStoryboard", प्रेषक: स्व)
Rajneesh071

14

आप इस तरह से segue का उपयोग कर सकते हैं:

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

    }
}

उत्तर के लिए धन्यवाद, हालांकि PerformSegueWithIdentifier एक व्यू कॉन्ट्रोलर विधि है, और मेरा कोड एक बाहरी वर्ग में चलता है
श्लोमी श्वार्ट्ज

13

स्विफ्ट 3 - स्प्राइटकिट के साथ भी काम करता है

आप NSNotification का उपयोग कर सकते हैं ।

उदाहरण:

1.) स्टोरीबोर्ड में एक segue बनाएं और पहचानकर्ता को "segue" नाम दें

2.) ViewController में एक समारोह बनाएँ आप से बहस कर रहे हैं।

func goToDifferentView() {

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

}

3.) अपने ViewController के ViewDidLoad () में आप पर्यवेक्षक बनाने से बहस कर रहे हैं।

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

अद्यतन - पिछली बार जब मैंने इसका उपयोग किया तो मुझे .addObserverत्रुटियों को चुप कराने के लिए कॉल को निम्न कोड में बदलना पड़ा ।

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

4.) ViewController या दृश्य में आप जिस पर भी बहस कर रहे हैं, पोस्ट विधि को जोड़ दें जहां भी आप चाहते हैं कि ट्रिगर ट्रिगर किया जाए।

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

अद्यतन - पिछली बार जब मैंने इसका उपयोग किया तो मुझे .postत्रुटियों को चुप कराने के लिए कॉल को निम्न कोड में बदलना पड़ा ।

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

स्विफ्ट 3:NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
माइकल समोयलोव

3

इकाई परीक्षण के लिए आप जो करना चाहते हैं वह वास्तव में महत्वपूर्ण है। मूल रूप से आपको व्यू कंट्रोलर में एक छोटा स्थानीय फ़ंक्शन बनाने की आवश्यकता होती है। फ़ंक्शन को कुछ भी नाम दें, बस शामिल करें performSegueWithIndentifier

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

अगला FBManagerएक यूनेलाइज़र को शामिल करने के लिए अपने उपयोगिता वर्ग को बदलें जो एक फ़ंक्शन का तर्क लेता है और 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 आपको इकाई परीक्षण में सेगमेंट को निष्पादित किए बिना उपयोग करने की अनुमति देता है।)

अंत में, जहां आपके पास // टूडू है: अगले दृश्य पर बहस करें ???, की तर्ज पर कुछ डालें:

self.yourFunction()

अपनी इकाई परीक्षणों में, आप इसे बस के रूप में लागू कर सकते हैं:

let f = UtilClass()
f.doThatThing()

जहां doThatThing आपका fbsessionstatechange है और UtilClassFBManager है।

अपने वास्तविक कोड के localFuncलिए, FBManager वर्ग के लिए बस पास (कोई कोष्ठक नहीं) करें।


2

इसने मेरे लिए काम किया।

सबसे पहले अपने स्टोरीबोर्ड में व्यू कंट्रोलर को पहचान निरीक्षक के अंदर एक स्टोरीबोर्ड आईडी दें। फिर निम्नलिखित उदाहरण कोड का उपयोग करें (वर्ग, स्टोरीबोर्ड नाम और कहानी बोर्ड आईडी का मिलान करें जो आप उपयोग कर रहे हैं):

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.com शुभकामनाएं


1

आप इस performSegueWithIdentifierकार्य को फंक्शन का उपयोग करके कर सकते हैं ।

स्क्रीनशॉट

वाक्य - विन्यास :

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

उदाहरण :

 performSegueWithIdentifier("homeScreenVC", sender: nil)

1

एक अन्य विकल्प मोडल सेग का उपयोग करना है

चरण 1: स्टोरीबोर्ड पर जाएं, और व्यू कंट्रोलर को स्टोरीबोर्ड आईडी दें । आप दाईं ओर आइडेंटिटी इंस्पेक्टर में स्टोरीबोर्ड आईडी को बदल सकते हैं। स्टोरीबोर्ड आईडी की सुविधा देता हैModalViewController

चरण 2: 'प्रेषक' दृश्य नियंत्रक खोलें (इसे कॉल करें 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)
   }
}

0

यह मेरे लिए काम किया:

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


    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.