2010-01-14 12 views
5

जोड़ने के बाद मुझे लगता है कि मुझे कुछ मौलिक याद आ रही है और इसलिए मैं कुछ मदद के लिए समुदाय से पूछना चाहता हूं। मैं एक बुनियादी आईफोन उपयोगिता अनुप्रयोग के आधार पर एक ऐप का निर्माण कर रहा हूं। मेरा मेन व्यू और फ्लिपसाइड व्यू कुछ तत्व साझा करता है इसलिए मैंने उन टुकड़ों के लिए अलग व्यू कंट्रोलर और निब फाइलें बनाई हैं। ऐसा करने के लिए मैंने निम्न कार्य किया है: 1. SearchDateViewController नामक एक व्यू कंट्रोलर बनाया गया है जो फ़ाइल का स्वामी है SearchViewView.xib 2. SearchDateView.xib मूल रूप से UILiew के साथ UIView है, दृश्य सही ढंग से वायर्ड किया गया है 3. दोनों MainViewController.m और FlipsideViewController.m अंदर मैं folllows के रूप में एक subview जोड़ें:पर्यवेक्षण और पेरेंटव्यू कंट्रोलर शून्य सबव्यू

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

सब कुछ प्रदर्शित करता है और बस ठीक काम करता है। मूल रूप से प्रत्येक मुख्य और फ्लिपसाइड विचारों में होने वाली कार्रवाइयों के आधार पर निब के UILabel को बदल दिया जाता है। हालांकि, अगर मैं SearchVateViewController को मेनव्यू या FlipsideView से लोड किया गया है, तो मैं कुछ अलग करना चाहता था। हालांकि, मुझे यह पता लगाना प्रतीत नहीं होता कि ViewController SearchDateViewController सबव्यू जोड़ रहा है।

searchDateViewController में मैंने कोशिश की:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

दोनों ही मामलों मैं नहीं के बराबर मिलता है।

तो मेरा सवाल है - क्या मैं यह पता लगा सकता हूं कि कौन सा व्यू कंट्रोलर खोज जोड़ रहा हैडेटव्यू कंट्रोलर एक सबव्यूव? यदि हां, तो कैसे? या अगर मेरा तर्क यहां पूरी तरह से गड़बड़ हो गया है, तो मुझे यह कैसे करना चाहिए?

धन्यवाद!

उत्तर

2

viewDidLoad शुरू हो जाती है। आपके मामले में, कि इस पंक्ति में happends:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

उस पल में, आप अभी तक नहीं बुलाया है addSubview: तो यह कोई आश्चर्य नहीं देखने के superview नहीं के बराबर है।

अपनी समस्या का समाधान करने के लिए, आपको विभिन्न मामलों के बीच अंतर करने के लिए SearchDateViewController के अंदर एक संपत्ति को परिभाषित करना चाहिए। इस संपत्ति को तब मूल नियंत्रक द्वारा निर्धारित किया जाएगा जो SearchDateViewController उदाहरण बनाता है।

आम तौर पर, मुझे नहीं लगता कि एक दृश्य के लिए एक UIViewController सबक्लास का उपयोग करने के लिए एक अच्छा विचार है जिसका उपयोग पूर्णस्क्रीन दृश्य के रूप में उपयोग किए जाने के बजाय एक या कई पूर्णस्क्रीन दृश्यों के सबव्यूव के रूप में किया जाता है। UIViewController का अधिकांश तर्क इस धारणा पर काम करता है कि इसका उपयोग पूर्णस्क्रीन दृश्य को प्रबंधित करने के लिए किया जाता है। उदाहरण के लिए, आपके डिज़ाइन के साथ, मुझे लगता है कि यह संभव है कि जब डिवाइस अभिविन्यास बदलता है तो SearchDateViewController दृश्य के फ्रेम को संशोधित करेगा।चूंकि आपको गैर-पूर्णस्क्रीन सबव्यू के लिए इस कार्यक्षमता की आवश्यकता नहीं है, इसलिए मेरा सुझाव है कि आप सीधे अपने NSDbject से अपने SearchDateViewController को उपclass करें।

+0

सब्यूव्यू और UIViewController उपclasses के बारे में सही दिशा में मुझे इंगित करने के लिए ठीक है धन्यवाद। यदि मैं NSDbject का सर्चडेटव्यू कंट्रोलर एक सबक्लास बना देता हूं तो यह कैसे है कि मैं सबव्यू जोड़ रहा हूं और निब के साथ इनसाइट को कैसे प्रभावित कर रहा हूं? मुझे व्यू कंट्रोलर के बजाय nsobjects के रूप में सबव्यूज़ के कोई उदाहरण नहीं मिला है, लेकिन मैं इस मामले में जो मानक अभ्यास कर रहा हूं उसे अपनाना शुरू करना चाहता हूं। अगर आपके पास कोई और सुझाव है तो मुझे बताएं - धन्यवाद! इसके अलावा - आप दोनों ने पेरेंट कंट्रोलर का उपयोग करने का सुझाव दिया है, जो समझ में आता है, लेकिन पर्यवेक्षण किस भूमिका निभाता है? क्या यह यहां अधिक उपयुक्त होगा? – deadroxy

+0

NSDbject के एक उप-वर्ग को SearchDateViewController बनाना आपकी समस्या को दूर नहीं करता है, यह केवल भविष्य की समस्याओं से बचाता है क्योंकि UIViewControllers वास्तव में उन दृश्यों के लिए उपयोग नहीं किया जाता है जो पूरी विंडो IMHO नहीं लेते हैं। अपनी समस्या का समाधान करने के लिए, आपका दृश्य अनुकूलन कोड self.parentViewController पर निर्भर नहीं होना चाहिए या देखें। सुपरव्यू बिल्कुल। इसके बजाय, SearchDateViewController (एक बूल या एनम हो सकता है) में एक संपत्ति को परिभाषित करें, फिर आप यह तय करने के लिए क्वेरी करते हैं कि दृश्य को कैसे अनुकूलित किया जाए। ऑब्जेक्ट जो SearchDateViewController बनाता है उसे संपत्ति सेट करनी चाहिए। –

+0

मैंने ठीक उसी तरह किया था जैसा आपने SearchDateViewController क्लास में एक संपत्ति बनाने के लिए कहा था जो ठीक काम करता था। हालांकि, मैं अभी भी इस बात से परेशान हूं कि UIViewController से UIView/NSObject से उप-वर्गीकृत होने के तरीके को कैसे बदला जाए। विशेष रूप से SearchDateView का फ़ाइल स्वामी कौन बन जाता है? मैंने हर तरह से कोशिश की और मैंने जो कुछ भी किया है, वह त्रुटियों में परिणाम देता है ... – deadroxy

-2

व्यू कंट्रोलर और विचार पूरी तरह से अलग हैं।

ज्यादातर मामलों में, जब आप किसी मूल दृश्य में कोई सबव्यूव जोड़ते हैं तो आप अपने नियंत्रक को माता-पिता के दृश्य नियंत्रक में नहीं जोड़ते हैं। इस नियम का अपवाद नेविगेशन नियंत्रक है जो दृश्य नियंत्रकों के पदानुक्रम को बनाए रखने के लिए दृश्य के बजाय नियंत्रक को जोड़ता है।

आपका SearchDate व्यू कंट्रोलर अभिभावक नियंत्रक नहीं ढूंढ सकता क्योंकि आपने कभी एक असाइन नहीं किया है और सिस्टम स्वचालित रूप से ऐसा नहीं करता है। जब आप किसी अन्य नियंत्रक से दृश्य उत्पन्न करते हैं तो आप केवल एक अभिभावक नियंत्रक असाइन कर सकते हैं। जब दृश्य नियंत्रक अपने दृश्य के लोड होते ही

searchDateViewController.parentController=self; 
+0

मेरी समझ यह है कि parentViewController केवल तैयार है इसलिए मैं इसे सेट नहीं कर सकता (वास्तव में मुझे कोशिश करते समय त्रुटि मिलती है)। – deadroxy

+0

त्वरित अनुवर्ती - मुझे लगता है कि आप का अर्थ हो सकता है क्योंकि ओले ने इस जानकारी को रखने के लिए SearchDateViewController के अंदर एक नई संपत्ति बनाने के लिए किया था। यह काम करता है, लेकिन मुझे अभी भी इस रणनीति के बारे में ओले की टिप्पणी के बारे में चिंतित चिंताएं हैं (UIViewControllers को सबव्यू के रूप में उपयोग करने के लिए) आमतौर पर अच्छे डिजाइन सिद्धांतों के खिलाफ जा रहे हैं ... – deadroxy

+0

आपका अधिकार केवल पढ़ने के लिए है। मैंने अभी माना है कि यह पढ़ा/लिखना था क्योंकि नेविगेशन नियंत्रक विशेषता सेट करता है। मुझे आश्चर्य है कि कैसे नेविगेशन नियंत्रक विशेषता सेट करता है? ओले सही है कि एक ही दृश्यमान स्क्रीन पर एकाधिक नियंत्रक होने का बुरा अभ्यास है। एपीआई आसानी से इसका समर्थन नहीं करता है। – TechZen

संबंधित मुद्दे