2008-10-14 24 views
22

मैं एनएसटीबल दृश्य में उपयोग के लिए एनएससीएल को उपclass करने की कोशिश कर रहा हूं। जिस सेल को मैं बनाना चाहता हूं वह काफी जटिल है इसलिए यह बहुत उपयोगी होगा अगर मैं इसे इंटरफ़ेस बिल्डर में डिज़ाइन कर सकता हूं और फिर एनएससीएल को निब से लोड कर सकता हूं।क्या इंटरफ़ेस बिल्डर में एनएससीएल उप-वर्गों को डिज़ाइन करना संभव है?

क्या यह संभव है? मैं यह कैसे करुं?

+0

अब एनएसटीबल व्यू एनएसटीबलसेलव्यू का समर्थन करता है, मुझे आश्चर्य है कि आईबी से सब कुछ करने का समर्थन करने का एक बेहतर तरीका है या नहीं। – tofutim

उत्तर

0

मैं इस तरह यह कार्य करें:

/* example of a silly way to load a UITableViewCell from a standalone nib */ 

+ (CEntryTableViewCell *)cell 
{ 
// TODO -- this is really silly. 
NSArray *theObjects = [[NSBundle mainBundle] loadNibNamed:@"EntryTableViewCell" owner:self options:NULL]; 
for (id theObject in theObjects) 
    if ([theObject isKindOfClass:self]) 
     return(theObject); 
NSAssert(NO, @"Could not find object of class CEntryTableViewCell in nib"); 
return(NULL); 
} 

हालांकि यह बहुत ही कुशल नहीं है और यह तुम्हें चोट लगी हो सकता है यदि आप डेटा की बहुत लोड कर रहे हैं। निस्संदेह आपको एक पुन: उपयोग करने वाला यंत्र का उपयोग करना चाहिए जो इस कोड को प्रति टेबल केवल कुछ हद तक चलाने के लिए मजबूर होना चाहिए।

+1

प्रश्न कोको के लिए था, कोको टच – srgtuszy

5

आईबी में, एक खाली XIB शुरू करें। अब पैलेट पर जाएं और UITableViewCell में खींचें, ऊपर लाने और संपादित करने के लिए डबल क्लिक करें। यकीन है कि यह आईबी में एक असली UITableViewCell है बनाने के लिए, या आप एक पुन: उपयोग पहचानकर्ता सेट नहीं कर सकता है (जैसा कि अपने कस्टम UITableViewCell वर्ग के रूप में आईबी में एक UIView कास्टिंग के लिए विरोध -

केवल कस्टम UITableViewCell (कोई अन्य UIViews या अन्य शीर्ष स्तर नियंत्रण) शामिल)। फिर आप सेल के भीतर लेबल्स या जो भी चाहें जोड़ सकते हैं, साथ ही पुन: उपयोग पहचानकर्ता सेट कर सकते हैं या जो भी प्रकटीकरण संकेतक आपको पसंद कर सकते हैं सेट कर सकते हैं।

का उपयोग करने के लिए आपको tableView में इस तरह कोड प्रदान करते हैं: cellForRow: atIndexPath: विधि:

YourCustomCellClass *cell = (YourCustomCellClass *)[tableView dequeueReusableCellWithIdentifier:<IDYouSetInXIBFile>]; 
if (cell == nil) 
{ 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:<YourXIBName> owner:self options:nil]; 
    id firstObject = [topLevelObjects objectAtIndex:0]; 
    if ([ firstObject isKindOfClass:[UITableViewCell class]]) 
     cell = firstObject; 
    else cell = [topLevelObjects objectAtIndex:1]; 
} 

आप किसी भी लेबल या अन्य नियंत्रण आप अपने कोड में संदर्भ लेना चाहते हैं, तो उन्हें आईबी में करने के लिए तार आपकी कस्टम सेल क्लास - फ़ाइल का स्वामी नहीं, जिसे आपको उपर्युक्त कोड का उपयोग करने की आवश्यकता नहीं है (आप इसे NSObject के रूप में छोड़ सकते हैं)।

संपादित करें: मुझे लगता है कि आप वास्तव में एक एनएससीएलएल उत्तर की तलाश में हैं, लेकिन आईबी का उपयोग करने के लिए कोड दृष्टिकोण कोको में कोको टच कोड के साथ समान होना चाहिए जैसा कि मैंने ऊपर इस्तेमाल किया था .NNNamed एक मानक कोको कॉल है।

+0

किसी भी तरह मैंने पहली बार गलत नहीं किया, लेकिन आपके विस्तृत निर्देश (शुरुआत) ने दिन बचा लिया। Thanx! – JOM

+6

आपको यहां गलत ओएस मिला है। यह कोको टच नहीं है। – Domness

11

प्रश्न एनएससीएल के उप-वर्ग के बारे में था; अन्य उत्तर कुछ और कर रहे हैं, संभवतः UITableViewCell का एक दृश्य होने का लाभ उठा रहा है।

एनएससीएल एक दृश्य नहीं है। आईबी में एक कस्टम सेल डालने के दौरान एक उपयोगी चीज होगी जो करने में सक्षम है, मुझे लगता है कि जवाब मूल रूप से "नहीं, यह संभव नहीं है"। जब आप एनएससीएलएल को उप-वर्गीकृत करते हैं, तो आप बस अपना खुद का चित्रण कर रहे हैं। समर्थन subcells, या पैरामीटरकृत ऑटो लेआउट (एला NSView के स्प्रिंग्स और स्ट्रैट्स) नहीं है, जो मुझे संदेह है कि आप क्या देख रहे हैं।

एकमात्र चेतावनी यह है कि आप एक एनएससीएल सबक्लास डिजाइन कर सकते हैं कि उप-तत्वों का लेआउट करें और उन सबलेमेंट्स और सभी ट्विकेबल पैरामीटर सेट करने के लिए पैरामीटर प्रदान करें। फिर, आपको उस सेल और आईबी में डिज़ाइन समय पर उपलब्ध इंस्पेक्टर के साथ आईबी प्लगइन लिखना होगा।

हालांकि, यह एक छोटा सा ऐप लिखने से शायद कठिन है जो एक ही चीज़ को कम या कम करता है। एक खिड़की के बीच में एक एनएससीएल को एक नियंत्रण में रखें, और अपने इच्छित पैरामीटर को ट्विक करने के लिए स्वयं को यूआई बनाएं। बाइंडिंग स्थिति निर्धारण के लिए यह बहुत सरल बना सकती है (यानी एक स्लाइडर को एक्स मान बांधें), हालांकि आप पाठ्यक्रम के तत्वों का प्रत्यक्ष हेरफेर नहीं मिलता है। जब आप पूरा कर लेंगे, तो आप अपने सेल को संग्रहित कर सकते हैं और अपने असली ऐप में रनटाइम पर संग्रह लोड कर सकते हैं, या आप केवल गुणों को लॉग आउट कर सकते हैं और उन्हें अपने ऐप में कोड में सेट कर सकते हैं।

2

जोर विंगफर्स ने संबंधित विषय, Subviews in TableView Rows पर कुछ साल पहले Stepwise के लिए एक लेख लिखा था।

मुख्य तकनीक एनएससीएल बनाने की है जो एनएसवी व्यू होस्ट कर सकती है। यदि आप ऐसा करना चाहते थे, तो आप इंटरफ़ेस बिल्डर में एक एनएसवी व्यूक्लस डिज़ाइन कर सकते हैं जिसे आप उस विशिष्ट सेल की कहीं भी एम्बेड कर सकते हैं।

एक और संभावना है, अगर आप तेंदुए लक्षित कर सकते हैं, यह देखने के लिए कि क्या आप एक NSTableView का उपयोग करें या चाहे आप एक NSCollectionView उपयोग कर सकते हैं की जरूरत है। संग्रह विचार सीधे कोशिकाओं के बजाय "आइटम दृश्य" के संदर्भ में सौदा करते हैं, इसलिए वे इंटरफ़ेस बिल्डर में डिज़ाइन करने के लिए अधिक सरल होते हैं।

7

के रूप में केन कहते हैं, NSCells और NSViews अलग हैं, और आप केवल निब में NSView पदानुक्रम बाहर रखना कर सकते हैं, नहीं NSCells (जो किसी भी स्पष्ट पदानुक्रम की जरूरत नहीं है)।

दूसरी ओर, वहाँ कुछ भी नहीं NSViews के एक पदानुक्रम के होने और उस का उपयोग कर आकर्षित करने के लिए करने से रोकने है अपने NSCell - आप अपने सेल के माता-पिता को देखने के एक subview के रूप में उन्हें जोड़ सकता है, प्रदर्शित करने के लिए उनसे कहता हूं, और से उन्हें हटाने खिड़की और कोई भी बुद्धिमान नहीं होगा।

इस मामले में, एनआईबी का उपयोग करना काम करेगा, हालांकि यह परेशानी का एक टन लगता है। आम तौर पर मैंने उस ऑब्जेक्ट को प्रतिस्थापित किया है जो NSCells को कस्टम 0 के साथ लेता है जो मेरा NSViews लेता है, लेकिन इसका मतलब है कि अपना माउस-हैंडलिंग कोड लिखना, जो बहुत स्पर्शपूर्ण है।

दूसरी ओर, मेरी दृष्टिकोण आप निब में देखा गया 'मूल्यों के लिए बाध्य है, तो आप किसी अतिरिक्त कार्य है, जो अच्छा है क्या करना है न हो।

-1

अपने UITableViewCell अपने tableviewcontroller में जोड़े और घोषित एक IBOutlet संपत्ति:

@interface KuguTableViewController : UITableViewController { 
    IBOutlet UITableViewCell *customTypeCell; 
} 

@property (readonly) UITableViewCell *customTypeCell; 

... तो cellForRowAtIndexPath में आप सिर्फ अपने सेल का उपयोग कर सकते हैं और सेट यह पुन: उपयोग किया जा करने के लिए:

static NSString *CellIdentifier = @"CustomCell" 
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
     cell = customTypeCell; 
     cell.reuseIdentifier = CellIdentifier; 
+0

आपको यहां गलत ओएस मिला है। – Domness

+0

हालांकि एक ऋण के लायक नहीं है। – evdude100

11

कुछ इस धागे में जवाब विषय से बाहर हो गए हैं क्योंकि वे कोको टच के बारे में बात कर रहे हैं, जब मूल प्रश्न कोको के बारे में था - 2 एपीआई इस संबंध में काफी अलग हैं और कोको टच इसे आसान बनाता है क्योंकि UITableViewCell av उपclass देखें। एनएससीएल नहीं है, और यह समस्या

जानकारी के लिए, मुझे हाल ही में NSOutlineView में कुछ समान करना था - जो मूल रूप से वही है, लेकिन कुछ भी मुश्किल है क्योंकि आपको स्तर के प्रकटीकरण/पतन से निपटना है । आप कोड में रुचि रखते हैं, मैं इसके बारे में यहाँ पोस्ट: http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/

HTH

+0

बिल्कुल वही जो मैं खोज रहा था –

1

मैं कुछ रोचक उदाहरण जो मैं पूरी तरह समझ में नहीं आता है, हालांकि पाया।

पिछले 2 उदाहरण NSTableViewDataSource और NSTableViewDelegate साथ काम करते हैं। InterfaceBuilder में टेक्स्ट फ़ील्ड जैसे अन्य यूआई तत्वों को जोड़ने के लिए मैं BindingsArrayController का उपयोग करना चाहता हूं।

0

1) NSViewControllerTableViewCell.h

2 बनाएं) -(NSView *)tableView:viewForTableColumn:row: write:

#import "TableViewCell.h"

4) मुख्य वर्ग में

-(void)setText:(NSString *)text image:(NSImage *)image 

3 जैसे कुछ प्रक्रियाओं) मुख्य वर्ग में TableViewCell.h में बनाएं

NSImage *img = //some image 
TableViewCell *cell = [[TableViewCell alloc] initWithWindowNibName:@"TableViewCell"]; 
cell.view.init; 
[cell setText:@"some text" image:img]; 
return cell; 

उम्मीद है कि यह मदद करेगा =)

0

मैं यहां एक और आधुनिक दृष्टिकोण प्रदान करना चाहता हूं।

iOS 5 के साथ शुरू, UITableView एक विधि

(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

एक बार जब आप अपने सेल युक्त अपने निब पंजीकृत है, बस

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

का उपयोग एक नया सेल प्राप्त करने के लिए। यदि कोई सेल पुन: उपयोग के लिए उपलब्ध है, तो इसे वापस कर दिया जाएगा, अन्यथा एक नया सेल स्वचालित रूप से बनाया जाएगा, और उस स्थिति में इसका मतलब एनआईबी फ़ाइल से भरा हुआ है।