2009-06-05 21 views
11

मैंने UITabBarController सबक्लास (MainViewController कहा जाता है) लिखा है और कुछ उदाहरण चर, विशेष रूप से स्थान के स्थान का स्थान जोड़ा है। MainViewController के प्रत्येक टैब को MainViewController के स्थल चर का उपयोग करने की आवश्यकता है। पहला टैब में, एक UIViewController उपवर्ग HomeViewController नाम है, मैं अपने viewDidLoad विधि लिखा था और साथ NSLog के लिए उत्पादन करने की कोशिश की दोनों ...अभिभावक दृश्य नियंत्रक (कस्टम) गुणों तक पहुंच

NSLog(@"%@", self.parentViewController.venue.name); 

और

NSLog(@"%@", self.tabBarController.venue.name); 

लेकिन XCode त्रुटि देता है

error: request for member 'venue' in something not a structure or union 

मैं MainViewController के भीतर से स्थल संपत्ति तक पहुंच सकता हूं, ठीक है, इसलिए वहां एक त्रुटि से इंकार कर दिया है। आईफोन सिम्युलेटर और self.tabBarController दोनों को MainViewController के उदाहरण के रूप में देखता है। लाइन ...

NSLog(@"%@", self.tabBarController); 

आउटपुट ...

2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600> 

चूंकि यह, मैं कास्टिंग का उपयोग कर शक में मदद मिलेगी एक MainViewController उदाहरण के रूप में देखा है। क्या स्थल का एक प्रति के साथ HomeViewController को आरंभ करने का मेरा एकमात्र अन्य विकल्प है या क्या मैं बस 'self.parentViewController.venue.name' के साथ कुछ पूरी तरह से गलत कर रहा हूं? धन्यवाद, रोब

+0

क्या आपने स्थान और नाम सही तरीके से नाम स्थापित किया है? यानी केवीसी अनुपालन एक्सेसर्स लिखा है या @property और @ सिंथेसाइज का इस्तेमाल किया? – Abizern

उत्तर

26

आप कुछ पूरी तरह से गलत कर रहे हैं। parentViewController को UIViewController के रूप में घोषित किया गया है। NSLog ing यह polymorphism के चमत्कारों के कारण अपने वास्तविक प्रकार का उत्पादन करता है।

UIViewController में Venue सदस्य नहीं है। आपका MainViewController करता है। इसे कास्टिंग वास्तव में सही जवाब है। MainViewController.h आयात करने के लिए भी सुनिश्चित करें।

#import "MainViewController.h" 
[...] 
NSString *name = ((MainViewController *)self.parentViewController)).venue.name; 

भी सुनिश्चित करें कि venue MainViewController के @property के रूप में घोषित किया गया है, ज़ाहिर है, है, और nameVenue के @property है।

+0

शानदार, धन्यवाद। मैंने ठीक पहले कास्टिंग करने की कोशिश की थी लेकिन मेरे ब्रैकेट को गड़बड़ कर दिया। – rob5408

+1

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

+1

निष्पक्ष होने के लिए, उनका सवाल था "क्या होमव्यू कंट्रोलर को स्थल की प्रतिलिपि बनाने के लिए मेरा एकमात्र अन्य विकल्प है या क्या मैं सिर्फ 'self.parentViewController.venue.name' के साथ कुछ पूरी तरह से गलत कर रहा हूं?" –

1

आपका NSLog() कथन इसे MainViewController के रूप में "देख रहा है" क्योंकि यह वास्तव में वस्तु है। हालांकि आप जिस समस्या का सामना कर रहे हैं, वह यह है कि संकलक वास्तव में इसका एहसास नहीं करता है क्योंकि parentViewController संपत्ति को सादे पुराने UIViewController के रूप में घोषित किया जाता है। भले ही आप वास्तव में इसके उप-वर्ग को वापस कर रहे हों, जहां तक ​​संकलक जानता है कि आप उस विधि को UIViewController पर कॉल करने का प्रयास कर रहे हैं, और यह शिकायत करने जा रहा है। इसे MainViewController पर कास्ट करना समस्या को हल करेगा।

2
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController]; 

//previous view controller 
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1]; 

account.property = object; 
[account doSmthng]; 
संबंधित मुद्दे