2016-02-10 13 views
20

के साथ डेटा पास करना मैंने दो दृश्य नियंत्रक बनाए। मैंने डेटा पास करने के लिए पहले से दूसरे तक एक सेग्यू बनाया। अब मैं दूसरे दृश्य नियंत्रक से पहले डेटा तक डेटा पास करना चाहता हूं। मैं कई समान प्रश्नों के माध्यम से चला गया और मैं उनको लागू करने में सक्षम नहीं हूं क्योंकि मुझे ज्ञान की कमी के बारे में ज्ञान नहीं है।अवांछित segue

ViewController.swift

class ViewController: UIViewController 
{ 
    var dataRecieved: String? 
    @IBOutlet weak var labelOne: UILabel! 
    @IBAction func buttonOne(sender: UIButton) 
    { 
     performSegueWithIdentifier("viewNext", sender: self) 
    } 
    override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) 
    { 

     var svc: viewControllerB = segue.destinationViewController as! viewControllerB 
     svc.dataPassed = labelOne.text 
    } 
} 

इस डेटा dataPassed करने के लिए दृश्य नियंत्रक "viewControllerB" में पारित करेंगे। कहें, अब मैं ViewControllerB से कुछ डेटा को ViewController में प्राप्त डेटा से पास करना चाहता हूं। प्रतिनिधिमंडल का उपयोग करके मैं केवल सिग्नल को छोड़कर ऐसा कैसे कर सकता हूं। मैं तेजी से नया हूं, विस्तृत स्पष्टीकरण की सराहना करता हूं।

+0

बस अपने अनचाहे दृश्य नियंत्रक में 'readyForSegue' को लागू करें और 'destinationViewController' तक पहुंचें जो दृश्य नियंत्रक होगा जिसे आप अनचाहे कर रहे हैं। आप शायद अपने स्टोरीबोर्ड – Paulw11

+0

में अनइंड सेग्यू और पहचानकर्ता देना चाहते हैं, यह एक त्रुटि देता है "पहचानकर्ता के साथ कोई सीगू नहीं है 'btnSubmitSegue' ''। मैंने दृश्य नियंत्रक में segue पहचानकर्ता जोड़ा है। मैं दृश्य नियंत्रकों दोनों को जोड़ने के लिए केवल एक segue का उपयोग कर रहा हूँ। मेरा मानना ​​है कि सीगू को खोलने से पहले किसी भी अतिरिक्त सीगू के बिना पिछले दृश्य नियंत्रक को वापस हवाएं मिलती हैं? क्या आप विस्तार से समझा सकते हैं?कुछ कोड की सराहना की जाएगी :) – ebby94

+0

आप सामान्य रूप से अवांछित segue बनाते हैं - दृश्य में 'निकास' आइकन पर खींचें। अब बाईं ओर ऑब्जेक्ट इंस्पेक्टर में आप व्यू कंट्रोलर, पहले उत्तरदाता और निकास आइकन के नीचे सूचीबद्ध अनइंड segue देखेंगे। आप अनइंड सेग्यू पर क्लिक कर सकते हैं और इसे दाईं ओर इंस्पेक्टर में पहचानकर्ता दे सकते हैं। – Paulw11

उत्तर

43

Øyvind हाउगे मुझे ही समाधान विधि से हरा दिया, लेकिन जैसा कि मैं पहले से ही एक अधिक विस्तृत जवाब के साथ शुरू किया था, मैं इसे साथ ही जोड़ देंगे।


चलो कहते हैं कि इस प्रकार के रूप में अपने दो दृश्य नियंत्रकों नाम हैं करते हैं:

  • मास्टर/प्रवेश बिंदु: ViewController(vcA)
  • माध्यमिक दृश्य: ViewControllerB(vcB)

आप segue की स्थापना (vcA) -> (vcB) से आपने जैसा किया है उदाहरण

/* in ViewController.swift */ 

// ... 

// segue ViewController -> ViewControllerB 
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) 
{ 
    if segue.identifier == "viewNext" { 
     let viewControllerB = segue.destinationViewController as! ViewControllerB 
     viewControllerB.dataPassed = labelOne.text 
    } 
} 

कुछ हद तक मुश्किल कदम अगले कि, इस विधि, segue डेटा(vcA) को वापस (vcB)से पारित करने के लिए प्रयोग किया जाता का उपयोग कर भी(vcA) के स्रोत को जोड़ा गया है, एक @IBAction पद्धति के रूप में है (न कि है जैसा कि संभवतः उम्मीद की जा सकती है, (vcB) के स्रोत में जोड़ा गया है)।

/* in ViewController.swift */ 

// ... 

// segue ViewControllerB -> ViewController 
@IBAction func unwindToThisView(sender: UIStoryboardSegue) { 
    if let sourceViewController = sender.sourceViewController as? ViewControllerB { 
     dataRecieved = sourceViewController.dataPassed 
    } 
} 

आप उसके बाद (vcB) में इस खोलना कार्रवाई करने के लिए (vcA) में मैनुअल Exit segue के माध्यम से (vcB) में कनेक्ट कहते हैं, एक बटन:

enter image description here

नीचे करने के लिए (vcA) से पाठ गुजर की एक पूरी उदाहरण इस प्रकार है (vcB); (संभवतः) उस पाठ को UITextField के माध्यम से संशोधित कर रहा है, अंततः (संभवतः) संशोधित पाठ को (vcA) पर वापस कर रहा है।


(vcA) स्रोत:

/* ViewController.swift: Initial view controller */ 
import UIKit 

class ViewController: UIViewController { 

    var dataRecieved: String? { 
     willSet { 
      labelOne.text = newValue 
     } 
    } 
    @IBOutlet weak var labelOne: UILabel! 

    @IBAction func buttonOne(sender: UIButton) { 
     performSegueWithIdentifier("viewNext", sender: self) 
    } 

    // set default labelOne text 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     labelOne.text = "Default passed data" 
    } 

    // segue ViewController -> ViewControllerB 
    override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) 
    { 
     if segue.identifier == "viewNext" { 
      let viewControllerB = segue.destinationViewController as! ViewControllerB 
      viewControllerB.dataPassed = labelOne.text 
     } 
    } 

    // segue ViewControllerB -> ViewController 
    @IBAction func unwindToThisView(sender: UIStoryboardSegue) { 
     if let sourceViewController = sender.sourceViewController as? ViewControllerB { 
      dataRecieved = sourceViewController.dataPassed 
     } 
    } 
} 

(vcB) स्रोत (ध्यान दें कि UITextFieldDelegate प्रतिनिधि यहां केवल "स्थानीय रूप से" जो (vcA) को लौटा दी जाएगी और करने के लिए सौंपा dataPassed संपत्ति का मूल्य, परिवर्तनशील के लिए प्रयोग किया जाता है बाद के dataRecieved संपत्ति)

/* ViewControllerB.swift */ 
import UIKit 

class ViewControllerB: UIViewController, UITextFieldDelegate { 

    var dataPassed : String? 
    @IBOutlet weak var textField: UITextField! 

    // set default textField text to the data passed from previous view. 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     textField.text = dataPassed 

     // Handle the user input in the text field through delegate callbacks 
     textField.delegate = self 
    } 


    // UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     // User finished typing (hit return): hide the keyboard. 
     textField.resignFirstResponder() 
     return true 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     dataPassed = textField.text 
    } 
} 

उदाहरण निष्पादन:

enter image description here

+0

विस्तृत स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! इससे मुझे बेहतर समझने में मदद मिली :) – ebby94

+0

शायद मेरे सामने यह सही होगा लेकिन 'नया वैल्यू' 'विलसेट { लेबलऑन.टेक्स्ट = नया वैल्यू }' –

+0

@ डार्कोरसेफैंटसीस्पोर्ट्स कोई चिंता नहीं: यह नया मान होने का डिफ़ॉल्ट नाम है सेट: _ "यदि आप 'विलसेट' पर्यवेक्षक को कार्यान्वित करते हैं, तो यह निरंतर पैरामीटर के रूप में नया प्रॉपर्टी वैल्यू पारित कर दिया गया है। आप इस पैरामीटर के लिए अपने 'willSet' कार्यान्वयन के हिस्से के रूप में एक नाम निर्दिष्ट कर सकते हैं। यदि आप पैरामीटर नाम नहीं लिखते हैं और आपके कार्यान्वयन के भीतर कोष्ठक, पैरामीटर को 'newValue'' के डिफ़ॉल्ट पैरामीटर नाम के साथ उपलब्ध कराया गया है। "_ - [स्विफ्ट भाषा गाइड - गुण] से (https://developer.apple.com/library/content/documentation/ स्विफ्ट/वैचारिक/Swift_Programming_Language/Properties.html)। – dfri

7

यह कैसे मैं यह कर देगी:

  1. दृश्य नियंत्रक 1 में एक आउटलेट, इस तरह बनाएँ:

    @IBAction func unwindToViewController1(segue: UIStoryboardSegue) { 
    
        let foo = segue.sourceViewController.foo 
    
        // TODO: Use foo in view controller 1 
    } 
    
  2. कनेक्ट दृश्य नियंत्रक 2 (वीसी आप से तनाव मुक्त कर रहे हैं) जैसा कि नीचे दिखाया गया है। पीसी सर्कल से वीसी 2 में 'बाहर निकलें' से खींचें। दृश्य नियंत्रक 1 से IBAction पॉप अप करना चाहिए। इसे चुनें enter image description here

  3. अब, जब भी आप दृश्य नियंत्रक 2 से तनाव कम करने, देखने नियंत्रक 1 में unwindToViewController1: विधि कहा जाता हो जाएगा।

  4. यह वह जगह है जहां आप दृश्य नियंत्रक से इच्छित संपत्ति को पुनर्प्राप्त करेंगे 2. ध्यान दें कि सही संपत्ति प्राप्त करने के लिए आपको segue.sourceViewController को अपने कस्टम व्यू कंट्रोलर सबक्लास में डालना होगा।

+0

धन्यवाद! उसने मेरे प्रश्न का उत्तर दिया :) – ebby94

+0

खुशी हुई यह –

0

अपने अनुप्रयोग आईओएस का समर्थन करता है, तो 9+ आप prepareForSegue के रूप में लगभग एक ही डेटा पारित कर सकते हैं, UIStoryboardUnwindSegueSource एक sender संपत्ति जो वास्तव में prepare(for segue: UIStoryboardSegue, sender: Any?) में sender संपत्ति के रूप में ही है कि का उपयोग करें।

इसका उपयोग कैसे करें:

  1. एक unwindTo विधि बनाएँ।

नोट: unwindTo विधि कनेक्ट के रूप में @ Øyvind हाउगे में ही है और @dfri उनके जवाब में विस्तार से बताया।

  1. आप के लिए थकान मिटाने के, इस विधि के अंदर विधि canPerformUnwindSegueAction(_:from:withSender:)
  2. ओवरराइड, देखें कि क्या प्रकार fromViewController प्रकार आप
  3. हैं से आ रहे थे है चाहता हूँ दृश्य नियंत्रक के अंदर यह, प्रकार आप भेजा sender संपत्ति डाली और सच लौट
  4. वरना, वापसी झूठी

कोड स्निप (स्विफ्ट 4.0) है:

@IBAction func unwindToMyFirstViewController(segue: UIStoryboardSegue) {} 

override func canPerformUnwindSegueAction(_ action: Selector, from fromViewController: UIViewController, withSender sender: Any) -> Bool { 
    if fromViewController is MyCustomViewController, 
     let customType = sender as? MyCustomType { 
     return true 
    } 
    return false 
} 
संबंधित मुद्दे