प्रतिलिपि बनाई जा रही UITableViewCell

वोट
7

मैं में एक कस्टम तालिका सेल पढ़ रहा हूँ tableView:cellForRowAtIndexPath:एक निब फ़ाइल से। यह मेरी प्रयोजनों के लिए महान काम करता है, को छोड़कर यह काफी धीमी है।

अब, मैं जानता हूँ कि लंबे समय में ऐसा करना सही कोड में पूरी तरह से सेल बनाने के लिए, और एक ही दृश्य का उपयोग करने के, और इतने पर है। लेकिन इस एक प्रोटोटाइप है, और मैं इसे में है कि बहुत प्रयास डाल करने के लिए नहीं करना चाहती।

अभी के लिए, मैं अगर मैं में केवल एक बार निब पढ़ रहा था खुशी होगी UIViewController, उपवर्ग तो tableView:cellForRowAtIndexPath:यह की प्रतियां बनाया है। मेरे यहां धारणा है कि नकल निब पढ़ने की तुलना में तेजी होगी।

यहाँ है कि मैं क्या निब, जो मैं से कॉल लोड करने के लिए उपयोग करते हैं viewDidLoad:(और retainबाद)

-(id)loadFromNamed:(NSString*)name {
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:name
                                                          owner:self
                                                        options:nil];
    assert( objectsInNib.count == 1 );
    return [objectsInNib objectAtIndex:0];
}

सभी अब तक अच्छा है। लेकिन सवाल यह है: मैं इस अधिक से अधिक कॉपी करूं? यह भी संभव है?

मैंने कोशिश की [_cachedObject copy]और [_cachedObject mutableCopy]लेकिन UITableViewCellया तो प्रति प्रोटोकॉल का समर्थन नहीं करता।

अगर मैं करने के लिए है, मैं बस की गति को अनदेखा करने की उन्हें बता सकते हैं जब तक मैं पूरी तरह से निब को दूर करने के लिए तैयार हूँ, लेकिन मैं नहीं बल्कि यह एक छोटे तेजी से हो रहा एक कम फांसी फल हो, तो यहाँ प्राप्त होगी।

कोई विचार?

20/02/2009 को 21:43
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
8

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

UITableViewCell NSCopying प्रोटोकॉल के अनुरूप नहीं है, लेकिन यह बंद संग्रह / गैर अभिलेख तंत्र का समर्थन करता है, तो यह क्लोनिंग के लिए इस्तेमाल किया जा सकता।

"जवाब के आधार पर कैसे उद्देश्य सी में एक UIButton नकल करने " मेरे डेटा स्रोत प्रतिनिधि विधि की तरह दिखता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellID = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellID];

    if (!cell) {
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableViewCell];
        cell = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
    }

    // ... config ...

    return cell;
}

और मेरे मामले में self.tableViewCell एक सेल दृश्य के निब फ़ाइल से एक बार लोड किया गया था है।

मैं परीक्षण नहीं क्या हो जाएगा तेजी से: "संग्रह + असंग्रहित" क्लोन करने के लिए या "लोड निब फ़ाइल + असंग्रहित" जो ढांचे के मामले में क्या होगा -loadNibNamed: मालिक: विकल्प: , मैं सिर्फ सुविधा विचार के साथ इस विधि का इस्तेमाल किया है, लेकिन अच्छा संभावना है कि स्मृति आपरेशन बनाम फ़ाइल आपरेशन तेजी से हो जाएगा।

संपादित करें: यह रूप में आसान के रूप में यह पहली बार में लग रहा था नहीं दिखाई देता है। UIImage NSCoding के अनुरूप नहीं करता है, के लिए कॉन्फ़िगर UIImageViews के साथ कोशिकाओं सिर्फ अतिरिक्त कोड के बिना कॉपी नहीं किया जा सकता है। हाँ, पूरी छवि को कॉपी निश्चित रूप से इस ओर इशारा करते हुए के लिए एक अच्छा अभ्यास है, एप्पल के लिए चियर्स नहीं है।

17/03/2011 को 13:00
का स्रोत उपयोगकर्ता

वोट
6

सेल क्लोनिंग तालिका दृश्य में बनाया का उपयोग करें। एप्पल तालिका सेल का एक बहुत पैदा धीमी थी पता था। इस विधि के लिए डॉक्स की जाँच करें:

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

आप सेल एक बार बनाने के रूप में नई कोशिकाओं अनुरोध कर रहे हैं तो, मौजूदा कोशिकाओं क्लोन करने के लिए है कि विधि का उपयोग करें। तो फिर तुम बस को बदलने की जरूरत है क्या नया सेल के बारे में परिवर्तित करने की और सेल वस्तु लौटने।

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


माइनर स्पष्टीकरण: मैं तुम्हारे लिए उपरोक्त विधि क्लोन कोशिकाओं लगता है न। इसके बजाय यह सेल उद्देश्य यह है कि स्क्रीन बंद स्क्रॉल किया है और बस एक नया स्थान के लिए उन्हें ले जाता है। तो यह सचमुच एक सेल पुन: उपयोग कर रहा है। तो सुनिश्चित करें कि आपके कस्टम तालिका दृश्य सभी नए मूल्यों यह intialization के बाहर की जरूरत करने के लिए सेट किया जा सकता है।

20/02/2009 को 22:11
का स्रोत उपयोगकर्ता

वोट
4

इस समाधान पर गर्व नहीं है, लेकिन यह संभव आईबी बाइंडिंग की अधिकतम संख्या के साथ काम करता है:

इंटरफेस (AlbumTableViewCell UITableViewCell का एक उपवर्ग जो का एक उदाहरण AlbumViewController के XIB फ़ाइल में परिभाषित किया जाता है):

@interface AlbumsViewController : UITableViewController {
    IBOutlet AlbumTableViewCell *tableViewCellTrack;
}

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

कार्यान्वयन (असंग्रहित / संग्रह एक कॉपी / क्लोन तालिका दृश्य सेल बना देता है):

@implementation AlbumsViewController

@synthesize tableViewCellTrack;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    AlbumTableViewCell *cell = (AlbumTableViewCell *)[tableView dequeueReusableCellWithIdentifier: @"AlbumCell"];

    if (cell == nil) {
        AlbumsViewController *albumsViewController = [[[AlbumsViewController alloc] init] autorelease];
        [[NSBundle mainBundle] loadNibNamed: @"AlbumsViewController" owner: albumsViewController options: nil];

        cell = albumsViewController.tableViewCellTrack;
    }

    cell.labelTitle.text = ...;
    cell.labelArtist.text = ...;

    return cell;
}
08/12/2009 को 10:06
का स्रोत उपयोगकर्ता

वोट
3

ठीक है, मुझे यकीन है कि क्यों वहाँ बाहर सभी ट्यूटोरियल इस कदम को निर्दिष्ट नहीं करता नहीं हूँ।

नोक से अपने स्वयं के कस्टम UITableViewCell उपयोग करते समय, dequeueReusableCellWithIdentifier बुला पर्याप्त नहीं है। आप तालिका देखें सेल टैब अनुभाग में बस के लिए के लिए, "पहचानकर्ता" आईबी में निर्दिष्ट करना होगा।

तो सुनिश्चित करें कि पहचानकर्ता आप आईबी में डाल पहचानकर्ता आप dequeueReusableCellWithIdentifier के लिए उपयोग के रूप में ही है या नहीं।

17/06/2009 को 05:10
का स्रोत उपयोगकर्ता

वोट
1

यहाँ यह स्विफ्ट में है

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell : UITableViewCell?
    let cellId = String(format: "Cell%d", indexPath.row)
    cell = alertTable!.dequeueReusableCellWithIdentifier(cellId) as! UITableViewCell?

    if cell == nil {
        let archivedData = NSKeyedArchiver.archivedDataWithRootObject(masterTableCell!)
        cell = NSKeyedUnarchiver.unarchiveObjectWithData(archivedData) as! UITableViewCell?
    }

    // do some stuff

    return cell!
}
24/10/2015 को 02:00
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more