वैचारिक रूप से जवाब देने के लिए, आपके टाइमर के UIView
बजाय की एक उपवर्ग होना चाहिए NSObject
।
IB में अपने टाइमर की एक आवृत्ति को तुरंत करने के लिए UIView
इसे अपने व्यू कंट्रोलर के दृश्य पर ड्रॉप आउट करें, और इसे अपने टाइम के क्लास के नाम पर सेट करें।
स्मरण में रखना #import
अपने व्यू कंट्रोलर में अपने टाइमर क्लास ।
संपादित करें: आईबी डिजाइन के लिए (कोड तात्कालिकता के लिए संशोधन इतिहास देखें)
मैं स्टोरीबोर्ड के साथ बिल्कुल परिचित नहीं हूं, लेकिन मुझे पता है कि आप आईबी में अपने इंटरफ़ेस का निर्माण एक .xib
फाइल का उपयोग करके कर सकते हैं जो स्टोरीबोर्ड संस्करण का उपयोग करने के लिए लगभग समान है; आपको अपने मौजूदा इंटरफ़ेस से .xib
फ़ाइल तक संपूर्ण रूप में अपने विचारों को कॉपी और पेस्ट करने में सक्षम होना चाहिए ।
इसका परीक्षण करने के लिए मैंने .xib
"MyCustomTimerView.xib" नामक एक नया खाली बनाया । फिर मैंने एक दृश्य जोड़ा, और उसमें एक लेबल और दो बटन जोड़े। इस तरह:
मैंने UIView
"MyCustomTimer" नाम से एक नया उद्देश्य-सी वर्ग उपवर्ग बनाया । अपने में .xib
मैंने MyCustomTimer होने के लिए अपनी फ़ाइल का स्वामी वर्ग निर्धारित किया है । अब मैं किसी भी अन्य दृश्य / नियंत्रक की तरह कार्यों और दुकानों को जोड़ने के लिए स्वतंत्र हूं। परिणामी .h
फ़ाइल इस तरह दिखती है:
@interface MyCustomTimer : UIView
@property (strong, nonatomic) IBOutlet UILabel *displayLabel;
@property (strong, nonatomic) IBOutlet UIButton *startButton;
@property (strong, nonatomic) IBOutlet UIButton *stopButton;
- (IBAction)startButtonPush:(id)sender;
- (IBAction)stopButtonPush:(id)sender;
@end
कूदने के लिए केवल एकमात्र बाधा .xib
मेरे UIView
उपवर्ग पर मिल रही है । .xib
आवश्यक रूप से सेटअप में नाटकीय रूप से कटौती का उपयोग करना । और जब से आप स्टोरीबोर्ड का उपयोग कर रहे हैं, हमें पता -(id)initWithCoder:
है कि टाइमर को लोड करने के लिए केवल एक ही इनिशलाइज़र है जिसे कहा जाएगा। तो यहाँ क्या कार्यान्वयन फ़ाइल की तरह दिखता है:
#import "MyCustomTimer.h"
@implementation MyCustomTimer
@synthesize displayLabel;
@synthesize startButton;
@synthesize stopButton;
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:
[[[NSBundle mainBundle] loadNibNamed:@"MyCustomTimerView"
owner:self
options:nil] objectAtIndex:0]];
}
return self;
}
- (IBAction)startButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor greenColor];
}
- (IBAction)stopButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor redColor];
}
@end
नाम की विधि loadNibNamed:owner:options:
बिल्कुल वैसा ही करती है जैसा उसे लगता है। यह निब को लोड करता है और "फाइल का मालिक" संपत्ति को स्वयं सेट करता है। हम सरणी में पहली वस्तु को निकालते हैं और यह निब का मूल दृश्य है। हम स्क्रीन पर एक सबव्यू और वोइला के रूप में दृश्य जोड़ते हैं।
जाहिर है कि यह केवल बटन को धकेलने पर लेबल की पृष्ठभूमि का रंग बदलता है, लेकिन यह उदाहरण आपको अपने रास्ते पर अच्छी तरह से मिलना चाहिए।
टिप्पणी के आधार पर नोट्स:
यह ध्यान देने योग्य है कि यदि आपको अनंत पुनरावृत्ति की समस्या हो रही है, तो आप शायद इस समाधान की सूक्ष्म चाल से चूक गए हैं। यह वह नहीं कर रहा है जो आपको लगता है कि यह कर रहा है। स्टोरीबोर्ड में डाला गया दृश्य नहीं देखा जाता है, लेकिन इसके बजाय एक अन्य दृश्य को एक सबव्यू के रूप में लोड करता है। यह दृश्य लोड करता है वह दृश्य है जो nib में परिभाषित किया गया है। निब में "फ़ाइल का मालिक" वह अनदेखी दृश्य है। ठंडा हिस्सा यह है कि यह अनदेखी दृश्य अभी भी एक ऑब्जेक्टिव-सी क्लास है, जिसे देखने के लिए एक तरह के व्यू कंट्रोलर के रूप में इस्तेमाल किया जा सकता है। उदाहरण के लिए IBAction
तरीकों मेंMyCustomTimer
कक्षा कुछ ऐसी होती हैं जिनसे आप किसी दृश्य नियंत्रक की अपेक्षा अधिक हो सकते हैं।
एक साइड नोट के रूप में, कुछ तर्क दे सकते हैं कि यह टूट गया MVC
और मैं कुछ हद तक सहमत हूं। मेरे दृष्टिकोण से यह एक प्रथा से अधिक निकटता से संबंधित है UITableViewCell
, जिसे कभी-कभी भाग नियंत्रक भी होना पड़ता है।
यह भी ध्यान देने योग्य है कि यह उत्तर एक बहुत विशिष्ट समाधान प्रदान करना था; एक स्टोरीबोर्ड पर एक ही दृश्य बनाने के लिए एक ही बार में एक ही बार में एक ही बार बनाया जा सकता है । उदाहरण के लिए, आप आसानी से एक समय में एक iPad स्क्रीन पर इन टाइमर के छह की कल्पना कर सकते हैं। यदि आपको केवल एक दृश्य नियंत्रक के लिए एक दृश्य निर्दिष्ट करने की आवश्यकता है जिसे आपके आवेदन में कई बार उपयोग किया जाना है तो इस प्रश्न के लिए ज्येवार्ड द्वारा प्रदान किया गया समाधान लगभग निश्चित रूप से आपके लिए एक बेहतर समाधान है।