2013-02-19 47 views
11

मेरे पास डैशबोर्ड (डी) नामक वीसी है जो लॉगिन (एल) नामक वीसी और रजिस्टर (आर) नामक वीसी खोल सकता है। लॉगिन भी वीसी रजिस्टर खोल सकते हैं।गंतव्य दृश्य नियंत्रक में segue के प्रेषक प्राप्त करें

मैं स्टोरीबोर्ड जितनी बार संभव उपयोग करने के लिए एल, डी आर, एल आर

तो, डी के मामले में प्रयास करते हैं, तो मैं इसके साथ बनाया है तीन segues, डी -> एल -> आर और डी -> आर के मामले में, जब मैं आर बंद करता हूं, तो मुझे एल को बंद करना होगा यदि आवश्यक हो और डी को सूचित करें जिसे वह उपयोगकर्ता इंफोस लोड करना शुरू कर सकता है (संक्षेप में लॉन्च फ़ंक्शन)।

तो, मैं गंतव्य vc में Segue के प्रेषक मिल चाहते हैं, जानते हुए भी कि मैं इसे ऐसे ही performSegueWithIdentifier के प्रेषक entrie में डाल: आर पर सूचना प्राप्त भेज होने से

[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self]; 

उत्तर

8

मैं यह कर चाहते हैं पंजीकरण/लॉगिन किया जाता है, और डी को सुनने के बाद सब कुछ पॉप और अपना डेटा लोड करें।

लेकिन आप इस के लिए एक संदर्भ हो रही पर जोर देते हैं, आप अपने गंतव्य कुलपति पर इस संपत्ति जोड़ सकते हैं और स्रोत में सेट कर सकते हैं, तो कुलपति prepareForSegue:sender:

+0

आपकी त्वरित प्रतिक्रिया के लिए बहुत बहुत धन्यवाद, मुझे अधिसूचना से अवगत नहीं था। मैं आपके रास्ते की कोशिश करता हूं जो अधिक उचित लगता है। लेकिन आप आर और एल को बंद करने का सबसे अच्छा तरीका जानते हैं, यह जानकर कि एल शायद नहीं बनाया गया है। –

+3

क्या आप 'UINavigationController' का उपयोग कर रहे हैं?यदि ऐसा है, तो 'popToRootViewController:' धक्का दिया गया सभी वीसी हटा देगा। यदि आप इसके बजाए मोडल वीसी प्रस्तुत कर रहे हैं, तो 'dismissViewControllerAnimated: समापन:' को कॉल करने वाले पहले नियंत्रक पर कॉल करने वाले सभी अन्य लोगों को भी खारिज कर दिया जाएगा जो इसके शीर्ष पर प्रस्तुत किए गए हैं। – Taum

0

आर के लिए एक प्रतिनिधि बनाएँ और डी बना और एलके प्रतिनिधि आर आवंटित करने के लिए .जब आप में काम खत्म आर अपने प्रतिनिधि का उपयोग rquired कार्रवाई करने के लिए प्रतिनिधि methods.Use prepareForSegue:sender लागू करने के लिए।

8

यह प्रतिनिधियों का उपयोग करने के लिए एक महान जगह की तरह लगता है। अपने RegisterViewController.h इस

@protocol RegisterViewDelegate <NSObject> 
- (void)tellRegisterDelegateSomething:(NSObject*)something; 
@end 

की तरह एक प्रोटोकॉल को परिभाषित फिर अपने वर्ग पर अपने प्रतिनिधि के लिए सूचक रखने

@interface RegisterViewController : UIViewController 
@property (weak, nonatomic) id <RegisterViewDelegate> delegate; 
@end 

अब पेश दृश्य नियंत्रक है कि वे अभी बनाए गए नए प्रोटोकॉल लागू बताओ। यह अन्य दृश्य नियंत्रकों की .h फ़ाइलों में किया जाता है जो इस दृश्य को प्रस्तुत करते हैं।

LoginViewController.h में

@interface LoginViewController : UIViewController <RegisterViewDelegate> 
@end 

DashboardViewController.h

में
@interface DashboardViewController : UIViewController <RegisterViewDelegate> 
@end 

ऊपर वर्गों के मीटर फ़ाइलों में, प्रोटोकॉल की विधि को लागू

- (void)tellRegisterDelegateSomething:(NSObject*)something 
{ 
} 

अब आप की जरूरत है प्रतिनिधि को असाइन करने के लिए जब आप इस तरह के दृश्य नियंत्रक को प्रस्तुत करने से अपना सेग्यू निष्पादित करते हैं ।

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"SegueToFbRegister"]) 
    { 
     RegisterViewController* destination = [segue destinationViewController]; 
     destination.delegate = self; 
    } 
} 

अब आप पेश दृश्य नियंत्रक (प्रतिनिधि) कहते हैं और यह किसी भी जानकारी (यह आपका RegisterViewController.m में ही कहा जाता है) इस तरह वापस भेजने की जरूरत के साथ कुछ करना हो सकता है।

if ([self.delegate respondsToSelector:@selector(tellRegisterDelegateSomething:)]) 
{ 
    // Tell the delegate something. 
    [self.delegate tellRegisterDelegateSomething:something]; 
} 

उदाहरण जहां आपको दो नियंत्रक के माध्यम से वापस जाने की आवश्यकता है, आप उसी मूल पैटर्न का पालन करते हैं।

@protocol LoginViewDelegate <NSObject> 
- (void)tellLoginDelegateSomething:(NSObject*)something; 
@end 

फिर अपने वर्ग पर

@interface LoginViewController : UIViewController 
@property (weak, nonatomic) id <LoginViewDelegate> delegate; 
@end 

अब डैशबोर्ड दृश्य नियंत्रक कि यह प्रोटोकॉल लागू करता है बता आपका प्रतिनिधि के लिए सूचक रखने के लिए। यह डैशबोर्ड व्यू कंट्रोलर की .h फ़ाइलों में किया जाता है जो इस दृश्य को प्रस्तुत करते हैं।

DashboardViewController की .m फ़ाइलों में DashboardViewController.h

@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate> 
@end 

में प्रोटोकॉल की विधि

जब आप segue प्रदर्शन ViewController पर प्रतिनिधि की स्थापना के ऊपर पैटर्न का पालन करें कार्यान्वित करें। अब जब प्रतिनिधि विधि को LoginViewController में बुलाया जाता है, तो आप प्रतिनिधि को डैशबोर्ड व्यू कंट्रोलर में भी कॉल करते हैं।

LoginViewController.m

- (void)tellRegisterDelegateSomething:(NSObject*)something 
{ 
    if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)]) 
    { 
     // Tell the delegate something. 
     [self.delegate tellLoginDelegateSomething:something]; 
    } 
} 

अब आप सभी जुड़े हुए हैं ताकि आप दोनों नियंत्रकों (या सिर्फ एक) के माध्यम से वापस डेटा पास है और इसके साथ कुछ कर सकते हैं में

। आपको पता चलेगा कि आप किस परिदृश्य में हैं क्योंकि डैशबोर्ड व्यू कंट्रोलर में विभिन्न प्रतिनिधि विधियों को कॉल किया जाएगा, जिसके आधार पर व्यू कंट्रोलर दिखाई दे रहा था।

उम्मीद है कि इससे मदद मिलती है।

+0

आपको भी धन्यवाद, लेकिन आईओएस पर नौसिखिया के लिए ताम का समाधान अधिक आसान है। –

+0

यह कोई समस्या नहीं है। वह पूरी तरह से मान्य है। प्रतिनिधि दृष्टिकोण का उपयोग करना थोड़ा और अधिक लचीला है क्योंकि आप वर्तमान प्रतिनिधि से जानकारी के साथ अपने प्रतिनिधि को वापस कॉल कर सकते हैं। यह उन परिदृश्यों में भी अधिक उपयोगी है जहां आपके पास मोडल या पॉप-ओवर व्यू हैं क्योंकि आप जानकारी को प्रतिनिधि को वापस भेज सकते हैं और आपके पास हमेशा नेविगेशन नियंत्रक से उन प्रकार के विचारों को पॉप करने का विकल्प नहीं होता है। एक नौसिखिया के लिए भी सीखने के लिए निश्चित रूप से एक शक्तिशाली उपकरण (और बहुत जटिल नहीं)। सौभाग्य – johnrechd

0

एक और तरीका एक अनजान segue का उपयोग करना होगा।

प्लेस आप में निम्न कोड डैशबोर्ड (डी) दृश्य नियंत्रक।

  1. बटन है कि पंजीकरण के पूरा होने पर दबाया हो जाएगा का चयन करें:

    @IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) { 
    
    } 
    

    इंटरफ़ेस निर्माता में, रजिस्टर (आर) दृश्य नियंत्रक के लिए निम्न चरणों का पालन करते हैं।

  2. Ctrl + दृश्य के शीर्ष पर बाहर निकलने के प्रतीक पर खींचें।
  3. प्रदर्शित सूची से loadUserInfoAfterRegistrationWithSegue: का चयन करें।

इस दृष्टिकोण का उपयोग करना, रजिस्टर (आर) दृश्य नियंत्रक हमेशा डैशबोर्ड (डी) दृश्य नियंत्रक पर जाएँ, क्या उन दोनों के बीच है की परवाह किए बिना होगा। उनके बीच दृश्य नियंत्रकों को छूना नहीं होगा। में उपयोगकर्ता डेटा की लोडिंग डैशबोर्ड (डी) देखें नियंत्रक को ऊपर घोषित विधि में भी अनुकूलित किया जा सकता है।