2009-08-12 16 views
7

मैं एक साधारण क्विज़ एप्लिकेशन डिज़ाइन कर रहा हूं। एप्लिकेशन को विभिन्न प्रकार के प्रश्नोत्तरी प्रदर्शित करने की आवश्यकता है। प्रत्येक प्रकार के क्विज़ क्वेस्टियन का एक अलग व्यवहार और यूआई है। alt text http://dl.getdropbox.com/u/907284/Picture%201.pngआईफोन सबव्यू डिज़ाइन (UIView बनाम UIViewController)

मैं इंटरफ़ेस बिल्डर में QuizQuestion के प्रत्येक प्रकार के डिजाइन करने के लिए सक्षम होने के लिए करना चाहते हैं:

यूजर इंटरफेस कुछ इस तरह हो जाएगा।

उदाहरण के लिए, एक MultipleChoiceQuizQuestion इस प्रकार दिखाई देगा: alt text http://dl.getdropbox.com/u/907284/Picture%202.png

मूल रूप से, मैं QuizQuestion वर्ग एक UIViewController बनाने की योजना बनाई। हालांकि, मैंने ऐप्पल प्रलेखन में पढ़ा है कि UIViewControllers का उपयोग केवल पूरे पृष्ठ को प्रदर्शित करने के लिए किया जाना चाहिए।

इसलिए, मैंने अपना क्विज़ कंट्रोलर (जो पूरे स्क्रीन को प्रबंधित करता है जैसे पिछला/अगला बटन) UIViewController और मेरी QuizQuestion क्लास UIView के उप-वर्ग को बनाया है।

हालांकि, (आईबी में बनाया गया) इस UIView लोड करने के लिए, मैं [1] मेरी निर्माता में निम्न करना होगा:

//MultipleQuizQuestion.m 
+(id)createInstance { 
    UIViewController *useless = [[UIViewController alloc] initWithNibName:@"MultipleQuizQuestion" bundle:nil]; 
    UIView *view = [[useless.view retain] autorelease]; 
    [useless release]; 
    return view; // probably has a memory leak or something 
} 

पहुँच के इस प्रकार के मानक है या वस्तु उन्मुख करने के लिए प्रतीत नहीं होता। क्या इस प्रकार का कोड सामान्य/स्वीकार्य है? या मैंने अपने डिजाइन में कहीं खराब विकल्प बनाया है?

ठनक यू,

संपादित करें (स्पष्टता के लिए): मैं multipleChoiceView ... एक ViewController तरह नियंत्रित करने के लिए एक अलग वर्ग करना चाहते हैं लेकिन जाहिरा तौर पर है कि पूरे खिड़कियों के लिए ही है। हो सकता है कि मुझे एक एकाधिकChoiceViewManager (नियंत्रक नहीं!) बनाना चाहिए और फ़ाइल के मालिक को इसके बजाय सेट करना चाहिए?

उत्तर

5

आप सही रास्ते पर हैं। अपने क्विज़ कंट्रोलर xib में, आप क्विज़ कंट्रोलर के मुख्य दृश्य की बजाय xib की मुख्य विंडो में खींचकर अलग-अलग दृश्य बना सकते हैं। फिर आप अपने प्रश्न प्रकारों के अनुसार आवश्यक प्रत्येक दृश्य को डिज़ाइन कर सकते हैं। जब उपयोगकर्ता अगली या पिछली बार टैप करता है, तो पिछले दृश्य को हटाएं और दृश्य नियंत्रक के मुख्य दृश्य पर -addSubview का उपयोग करके अपने प्रश्न प्रकार के आधार पर आवश्यक दृश्य लोड करें और वर्तमान में कौन सा सबव्यूव दिखा रहा है इसका ट्रैक रखें। कुछ इस तरह की कोशिश कर रहा:

[currentView removeFromSuperView]; 

switch(questionType) 
{ 
    case kMultipleChoice: 
     [[self view] addSubview:multipleChoiceView]; 
     currentView = multipleChoiceView; 
     break; 
    case kOpenEnded: 
     [[self view] addSubview:openEndedView]; 
     currentView = openEndedView; 
     break; 
// etc. 
} 

कहाँ multipleChoice देख सकते हैं और openEndedView विचारों आप आईबी में डिजाइन से जुड़े अपने QuizController में UIView आउटलेट हैं। सही स्थान पर प्रदर्शित करने के लिए इसे जोड़ने से पहले आपको मूल दृश्य में अपने दृश्य की स्थिति के साथ गड़बड़ करने की आवश्यकता हो सकती है, लेकिन आप इसे UIView पर -setBounds/-setFrame और/या -setCenter पर कॉल के साथ कर सकते हैं ।

+0

धन्यवाद है, लेकिन मैं एकाधिकChoiceView को नियंत्रित करने के लिए एक अलग वर्ग रखना चाहता हूं ... एक व्यू कंट्रोलर की तरह लेकिन स्पष्ट रूप से यह केवल पूरी विंडो के लिए है। शायद मुझे एक एकाधिकChoiceViewManager (नियंत्रक नहीं!) बनाना चाहिए और फ़ाइल के मालिक को इसके बजाय सेट करना चाहिए? – tba

+0

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

0

हाँ, आईफोन पर आईबी वास्तव में फ़ाइल के मालिक को UIViewController subclass बनना चाहता है, जो आपको थोड़ा मुश्किल बनाना चाहता है।

@implementation QuizController 

- (void) loadCustomViewFromNib:(NSString *)viewNibName { 
    (void)[[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil]; 
} 

@end 

कि निब लोड करने के लिए क्रम का कारण होगा, लेकिन कार्रवाई कनेक्ट करने के लिए नहीं बल्कि एक नया दृश्य नियंत्रक बनाने की तुलना में और: आप क्या कर सकते एक मौजूदा UIViewController के खिलाफ निब लोड एक instantiating निब उपयोग करने के बजाय है आउटलेट्स जो आप मालिक के रूप में पास करते हैं उसका उपयोग करेंगे। चूंकि हम उस निब में परिभाषित दृश्य में स्वयं को पास करते हैं, जिसे आप कॉल के बाद सौंपा गया आईबीओटलेट से जुड़ा होगा।

+0

धन्यवाद यह एक उपयोगी स्निपेट – tba

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