2011-01-27 5 views
15

एक छोटी सी पृष्ठभूमि: मैं CS193P iTune वीडियो के माध्यम से जा रहा हूं और मैं सबसे लंबे समय तक असाइनमेंट 3 पर फंस गया था। असल में, असाइनमेंट आपको स्क्रीन पर एक आकृति प्रदर्शित करने के लिए प्रोग्रामेटिक रूप से एक कस्टम दृश्य बनाने के लिए कहता है। मैं रास्ते में किसी भी दृश्य नियंत्रक का उपयोग नहीं कर रहा हूँ।आईओएस में प्रोग्रामेटिक रूप से दृश्य बनाना (यह कैसे काम करता है)?

मुझे तब तक प्रदर्शित करने के लिए मेरा दृश्य नहीं मिला जब तक कि अंत में मैंने इंटरफ़ेस बिल्डर में एक व्यू ऑब्जेक्ट खींच लिया और ऑब्जेक्ट का नाम मेरी कस्टम व्यू क्लास में बदल दिया। तो मेरा सवाल यह है कि जब लोग प्रोग्रामेटिक रूप से एक दृश्य बनाते हैं, तो क्या वे सिर्फ मैन्युअल रूप से कक्षा बनाते हैं लेकिन जब आपको इसे प्रदर्शित करने की आवश्यकता होती है तो आईबी का उपयोग करें? मैं महसूस करने में मदद नहीं कर सकता जैसे मैंने कुछ गलत समझा?

संपादित करें: मुझे और स्पष्ट होने दें। मेरा कस्टम व्यू 0, 0, 200, 150 के फ्रेम के साथ शुरू किया गया है और इसमें एक वर्ग बनाने के लिए drawRect अतिप्रवाह है। मेरा विचार भी दिखाई नहीं देता है, तो कोशिश मेरी नियंत्रक के भीतर मुख्य विंडो में जोड़ने:

UIWindow* window = [UIApplication sharedApplication].keyWindow; 
[window addSubview:polygonView]; 

हालांकि, अगर उपयोग खींचें आईबी में एक दृश्य और मेरे विचार वर्ग के लिए वर्ग बदलने के लिए, इसे ठीक से पता चलता।

संपादित करें: कुछ कोड जोड़ा गया। यह मेरा नियंत्रक जागृत है FromNib विधि जहां दृश्य खींचा जाना चाहिए। मेरी नियंत्रक के updateInterface विधि के

- (void)awakeFromNib { 
    shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12]; 
    polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    UIWindow *window = [UIApplication sharedApplication].keyWindow; 
    polygonView.backgroundColor = [UIColor blackColor]; 
    [window addSubview:polygonView]; 
    [self updateInterface]; 
} 

भाग:

- (void)updateInterface { 
    [polygonView setPolygon:shape]; 
    [polygonView setNeedsDisplay]; 
... 
} 

PolygonView.h

#import <UIKit/UIKit.h> 
#import "PolygonShape.h" 

@interface PolygonView : UIView { 
    IBOutlet PolygonShape *polygon; 
} 

@property (readwrite, assign) PolygonShape *polygon; 

- (void)drawRect:(CGRect)rect; 
@end 

PolygonView.m

#import "PolygonView.h" 

@implementation PolygonView 
@synthesize polygon; 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 
     nslog(@"initialized"); 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
     CGRect bounds = [self bounds]; 

    [[UIColor grayColor] set]; 
    UIRectFill(bounds); 

    CGRect square = CGRectMake(10, 10, 10, 100); 
    [[UIColor blackColor] set]; 
    UIRectFill(square); 

    [[UIColor redColor] set]; 
    UIRectFill(square); 
    NSLog(@"drawRect called"); 
} 
@end 

polygonView प्रारंभ की जा रही है लेकिन drawRect प्रतिसाद नहीं शांत नहीं हो रहा है घ।

+0

कुंजीविंडो कहां बनाया जा रहा है? यदि आप एक निब फ़ाइल लोड नहीं कर रहे हैं (यह आपके प्रश्न से स्पष्ट नहीं है कि आप हैं या नहीं), तो आपको अपना सबव्यूव जोड़ने से पहले विंडो बनाना होगा। – jlehr

+0

यह ऐपडिलेगेट क्लास में बनाया जा रहा है। क्या इसका मतलब है कि मुझे # पॉलीगॉन व्यू क्लास को वहां भेजना है और इसे वहां बनाना है? –

+0

दिलचस्प बात यह है कि अगर मैंने अपने अपडेट इंटरफेस विधि में विंडो में प्रारंभिकता और अपना दृश्य जोड़ना शुरू किया है, तो यह काम करता है, लेकिन जब मैं विधि को कॉल करने वाले बटन पर क्लिक करता हूं। ऐसा लगता है जैसे कोड जागने में प्रक्रिया नहीं हो रहा है FromNib। कोई विचार? –

उत्तर

16

और भी अधिक अपने प्रश्न के लिए विशिष्ट होने के लिए, वाक्य रचना होगा

UIWindow* window = [UIApplication sharedApplication].keyWindow; 

UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, 200, 150)]; 
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor]; 

[window addSubview:polygonView]; 
[polygonView release]; 

यह एक है पैटर्न आप न केवल इस के लिए उपयोग करेंगे, लेकिन बाद में सबव्यूज। साथ ही, एक और नोट कई टेम्पलेट्स के साथ है, व्यू कंट्रोलर पहले से ही अपने स्वयं के दृश्य के साथ स्थापित है। आप एक कस्टम दृश्य बनाना चाहते हैं, तो आप ऊपर, लेकिन विधि के बजाय की तरह इसे बनाने के ऊपर आप viewControllers सेट करें जिससे की तरह नव निर्मित देखने के लिए देखने:

viewController.view = polygonView; 

गुड लक!

+0

मुझे कुछ गलत करना होगा। मेरे पास यह ठीक है जैसा आपने लिखा है और मेरा विचार प्रदर्शित नहीं हो रहा है। –

+0

हम्म ... क्या होता है यदि आप drawRect पर टिप्पणी करते हैं या विशेष रूप से इसे initWithFrame में [self drawRect] के साथ कॉल करते हैं ;? –

+0

यदि मैं drawRect को ओवरराइड नहीं करता तो कुछ भी अलग नहीं होता है। अगर मैं initWithFrame विधि से drawRect को कॉल करता हूं तो मुझे अपवाद त्रुटि मिलती है: "कारण: '- [पॉलीगॉन व्यू ड्राआरक्ट]: अज्ञात चयनकर्ता उदाहरण 0x4b58c70' –

2

आपको एक सबव्यूव जोड़ने के लिए एक दृश्य (या विंडो) होना चाहिए। सामान्य वाक्य रचना इस तरह है:

UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds]; 
[mainView addSubview:newView]; 
[newView release]; 
बेशक

, अगर आपको लगता है कि UIView से विरासत एक कस्टम वस्तु है, तो आप UIView के बजाय कि प्रयोग करेंगे। जब आप एक नई प्रोजेक्ट शुरू करते हैं, तो "व्यू आधारित एप्लिकेशन" बनाएं, जो आपको एक व्यू कंट्रोलर से संबंधित दृश्य के साथ शुरू कर देगा (जिसे "कस्टमव्यू कंट्रोलर.व्यू" के साथ एक्सेस किया जा सकता है, जो कोड स्निपेट में "मेनव्यू" को प्रतिस्थापित करेगा ऊपर)।

यदि आप ऐप शुरू होने पर प्रोग्रामेटिक रूप से दृश्य बनाना चाहते हैं, तो कोड को अपने व्यू कंट्रोलर के "- (शून्य) viewDidLoad" विधि में रखें।

+0

मुझे पता है कि एक व्यू कंट्रोलर जाने का रास्ता होगा, लेकिन इस विशेष असाइनमेंट में केवल एक मॉडल क्लास, एक कंट्रोलर क्लास और कस्टम व्यू क्लास है। क्या आप कह रहे हैं कि मुझे अपनी दृश्य वस्तु को मुख्य विंडो में जोड़ना होगा? मैं और कहाँ करूँगा? –

0

कहीं भी आपके सक्रिय नियंत्रक वर्ग में, आप वर्तमान शीर्ष स्तर दृश्य में एक कस्टम दृश्य जोड़ सकते हैं।

[ myCurrentTopView addSubview: myNewCustomView ]; 

इससे पहले इस कस्टम दृश्य को आवंटित और प्रारंभ करने में मदद मिलती है।

उसके बाद, आप कार्य करके यह कस्टम दृश्य के drawRect में कुछ ड्राइंग को गति प्रदान कर सकते हैं एक:

[ myNewCustomView setNeedsDisplay ]; 
+0

मेरा वर्तमान टॉपव्यू मुख्य विंडो है। मुख्य विंडो मेरे नियंत्रक वर्ग में कोई ऑब्जेक्ट नहीं है, तो मैं एक दृश्य के रूप में अपना दृश्य कैसे सेट करूं ([विंडो addSubView: ...] काम नहीं करता है)। –

0

क्या आपने अपने विचार का पृष्ठभूमि रंग कुछ अलग करने के लिए सेट किया था?

क्या आप सुनिश्चित हैं कि आपका दृश्य प्रदर्शित नहीं होता है, या यह सिर्फ इतना है कि आप इसे नहीं देख सकते हैं? DrawRect में एक NSLog रखें: अपने दृश्य की विधि (यदि आप कस्टम व्यू क्लास का उपयोग करते हैं)।

+0

पर भेजा गया हां, मैंने अपने शुरुआती पृष्ठभूमि रंग को काले रंग में सेट करने की कोशिश की ताकि मैं देख सकूं कि मैं कर सकता हूं या नहीं एक सफेद या भूरे रंग के दृश्य को देखें, जो नहीं था। मैंने drawRect और iniWithFrame में एक NSLog संदेश भी लगाया जो कंसोल में भी नहीं दिखाया गया था। मुझे नहीं लगता कि मेरा विचार प्रारंभ किया जा रहा है भले ही मेरे पास polygonView = [polygonView initWithFrame: CGRectMake (0, 10, 320, 480)]; मेरे नियंत्रक की जागृत FromNib विधि में। –

+0

मैं इसे वापस देखने के दृश्य के बारे में वापस लेता हूं। यह है और iniWithFrame में NSLog संदेश दिखा रहा है। यह सिर्फ drawRect में NSLog संदेश है जो दिखाई नहीं दे रहा है। मैं देख सकता हूं कि मेरे मॉडल में मेरा डेटा सही रूप से मेरे दृश्य में पारित हो रहा है। मैं बस यह नहीं समझ सकता कि खिड़की मेरा विचार क्यों प्रदर्शित नहीं करेगी। –

+0

शायद थोड़ा और कोड हमें स्थिति का विश्लेषण करने में मदद करेगा। – fzwo

4

यह एक पुराना सवाल है, लेकिन मुझे यकीन नहीं है कि उसे जवाब मिला है - ऐसा लगता है कि वह उसी समस्या में भाग गया जहां मैंने UIViewController सबक्लास बनाया था, एक इंटरफेस बिल्डर निब में UIViewController को हराया लेकिन तो यह पता नहीं लगा सका कि दोनों एक-दूसरे के साथ काम कैसे करें।

यदि आपने निब को अलग से बनाया है (इसलिए यह आपके क्लास के साथ आपके लिए नहीं बनाया गया था) तो आपको इंटरफ़ेस बिल्डर में रखे गए UIViewController पर क्लिक करना याद रखना होगा, और उसके बाद गुण पैनल से तीसरे टैब बटन पर क्लिक करें ('कस्टम क्लास')। Class डिफ़ॉल्ट बेस क्लास UIViewController आदि होगा - बस इस ड्रॉपडाउन सूची को खोलें और आपको अपने सभी कस्टम सबक्लास की एक सूची दिखाई देगी, इसे चुनें और वोला - आपने अपने कस्टम तत्व को इंटरफ़ेस से लिंक किया है।

आशा है कि किसी दिन मुझे पता लगाने के लिए कुछ दिन बचाएगा, मुझे तब तक घूमने के कुछ बेवकूफ तरीके मिले जब तक कि मुझे सरल समाधान नहीं मिला।

0

मुझे हाल ही में एक बहुत ही समस्या थी और यहां मेरे लिए क्या काम किया गया: ऐसा लगता है कि जब एक्सकोड 4.3.2 में 'रिक्त एप्लिकेशन' से शुरू होता है तो आपको रूट व्यू के रूप में अपना मुख्य विंडो रूट दृश्य के रूप में सेट करना होगा addSubview के बजाय setRootViewController विधि। तो:

// Initialize myView and then 
[window setRootViewController:myView]; 
// instead of [window addSubview:myView]; 
// the rest as normal... 
[window makeKeyAndVisible]; 

इसके बाद आप अतिरिक्त दृश्य जोड़ने के लिए addSubview विधि का उपयोग कर सकते हैं।

2

हाय सिर्फ इस कोड जोड़ दें,

[window bringSubviewToFront:polygonView]; 

right after, 
[window addSubview:polygonView]; 
+1

यह एक बुरा अभ्यास है .... – Resty

0

कॉल

[super drawRect]; 

drawRect में अपने कस्टम कोड से पहले: शरीर।

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