تحميل القابل لإعادة الاستخدام UITableViewCell من بنك الاستثمار القومي

StackOverflow https://stackoverflow.com/questions/413993

سؤال

وأنا قادرة على تصميم مخصص UITableViewCells وتحميلها على ما يرام استخدام تقنية الموضحة في الموضوع وجدت في http://forums.macrumors.com/showthread.php?t=545061.غير أن استخدام هذا الأسلوب لم يعد يسمح لك الحرف الأول الخلية مع reuseIdentifier وهو ما يعني لديك لإنشاء كلها حالات جديدة كل خلية في كل مكالمة.أي شخص لديه برزت وسيلة جيدة لا تزال ذاكرة التخزين المؤقت خاصة أنواع الخلايا على إعادة استعمال, ولكن لا يزال قادرا على التصميم في واجهة باني ؟

هل كانت مفيدة؟

المحلول

وفقط تطبيق أسلوب مع توقيع الأسلوب المناسب:

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}

نصائح أخرى

في الواقع، منذ كنت بناء الخلية في واجهة البناء، مجرد مجموعة معرف إعادة استخدامها هناك:

وأو إذا كنت تقوم بتشغيل كسكودي 4، والتحقق من التبويب سمات مفتش:

و(تحرير: بعد إنشاء XIB عن طريق كسكودي، فإنه يحتوي على UIView فارغة، ولكن نحن بحاجة إلى UITableViewCell، بحيث يكون لديك لإزالة UIView يدويا وإدراج عرض الجدول خلية بطبيعة الحال، سوف IB لا تظهر أي UITableViewCell المعلمات لUIView).

والآن، في دائرة الرقابة الداخلية 5 هناك طريقة UITableView المناسب لذلك:

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

لا أستطيع أن أتذكر أين وجدت هذا الرمز في الأصل، ولكنه كان يعمل كبير بالنسبة لي حتى الآن.

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

والإعداد مثال واجهة البناء ...

وانظر إلى إجابة أعطيتها لهذا السؤال:

هل من الممكن تصميم فرعية NSCell في واجهة باني؟

ومن الممكن ليس فقط لتصميم UITableViewCell في IB، فمن المرغوب فيه لأنه بخلاف ذلك كل من الأسلاك اليدوي ووضع عناصر متعددة مملة جدا. Performaance على ما يرام طالما كنت حريصا على جعل كل عناصر مبهمة عندما يكون ذلك ممكنا. يتم تعيين reuseID في IB لخصائص UITableViewCell، ثم استخدام ID إعادة المطابقة في التعليمات البرمجية عند محاولة dequeue.

وسمعت أيضا من بعض المتدخلين في WWDC العام الماضي التي يجب أن لا تجعل خلايا عرض جدول في IB، لكنه حمولة من كلام فارغ.

واعتبارا من دائرة الرقابة الداخلية حوالي 4.0، وهناك تعليمات محددة في دائرة الرقابة الداخلية مستندات التي تجعل من هذا العمل بسرعة فائقة:

<وأ href = "http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7" يختلط = "نوفولو"> http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

وانتقل لأسفل إلى حيث يتحدث عن إن شاء subclasses ترث UITableViewCell.

وهنا هو خيار آخر:

NSString * cellId = @"reuseCell";  
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}

وأنا خلق بلدي خلايا عرض مخصصة بطريقة مشابهة - إلا أنني ربط الخلية من خلال IBOutlet

.

وهذا النهج [nib objectAt...] هو عرضة للتغييرات في مواقف العناصر في المصفوفة.

وهذا النهج UIViewController جيد - فقط حاولت ذلك، وأنها تعمل جميلة بما يكفي

ولكن ...

في جميع الأحوال لا يسمى المنشئ initWithStyle، لذلك لا يتم initialisation الافتراضية.

ولقد قرأت أماكن مختلفة حول استخدام initWithCoder أو awakeFromNib، ولكن لا يوجد دليل قاطع على أن أي من هذه هو الطريق الصحيح.

وبصرف النظر عن الدعوة صراحة بعض أسلوب التهيئة في طريقة cellForRowAtIndexPath لم أجد جوابا لهذا حتى الان.

وحين وجدت الظهر بلوق وظيفة كبيرة حول هذا الموضوع على الموقع blog.atebits.com ، وبدأت منذ باستخدام الطبقة لورين Brichter ABTableViewCell أن تفعل كل UITableViewCells بلدي.

وينتهي بك الأمر مع UIView حاوية بسيطة لوضع كل الحاجيات الخاصة بك، والتمرير وبسرعة البرق.

وهذا الأمل هو مفيد.

ويعمل هذا الأسلوب أيضا ولا يتطلب ايفار غير تقليدي في وحدة التحكم وجهة نظركم لإدارة الذاكرة. هنا، الخلية مخصصة عرض جدول تعيش في xib المسمى "CustomCell.xib".

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }

لويس الطريقة عملت بالنسبة لي.هذا هو رمز يمكنني استخدام لإنشاء UITableViewCell من بنك الاستثمار القومي:

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

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}

والحل gustavogb لا يعمل بالنسبة لي، ما حاولت هي:

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

ويبدو للعمل. وblogTableViewCell هو IBOutlet للخلية وChainesController هو صاحب الملف.

ومن مستندات UITableView بشأن dequeueWithReuseIdentifier: ".. سلسلة تحديد الكائن الخلية لإعادة استخدامها بشكل افتراضي، معرف خلية قابلة لإعادة الاستخدام هو اسم فئتها، ولكن يمكنك تغييره إلى أي قيمة التعسفية"

وتجاوز -reuseIdentifer نفسك محفوف بالمخاطر. ماذا يحدث إذا كان لديك اثنين من الفئات الفرعية من فئة فرعية الخليوي الخاص بك، واستخدام كل من هذه في طريقة عرض جدول واحد؟ اذا ما وجهوا الدعوة إعادة استخدام معرف على السوبر عليك dequeue خلية من النوع الخطأ .............. أعتقد أنك بحاجة إلى تجاوز أسلوب reuseIdentifier، ولكن ذلك يعود معرف محل خيط. أو، إذا لم يتم تحديد واحد، ولها أن تعيد الطبقة كسلسلة.

لما يستحق، وسألت مهندس فون عن ذلك في واحدة من المحادثات فون التقنية. كان جوابه: "نعم، فمن الممكن استخدام IB لخلق خلايا، ولكن لا تفعل ذلك. رجاء، لا تفعل ذلك."

وتابعت تعليمات أبل انها مرتبطة بن موشر (بفضل!) ولكن وجدت أن أبل حذفت نقطة مهمة. الكائن التي وضعت في IB هو مجرد UITableViewCell، كما هو متغير يتم تحميلها منه. ولكن إذا كنت فعلا إعداده باعتبارها فئة فرعية مخصصة من UITableViewCell، وكتابة الملفات رمز لفئة فرعية، يمكنك كتابة الإعلانات IBOutlet وطرق IBAction في رمز وسلك بها إلى العناصر المخصصة في IB. ثم ليست هناك حاجة إلى استخدام العلامات بغية الوصول إلى هذه العناصر ويمكنك إنشاء أي نوع من الخلايا المجنونة التي تريدها. انها الكاكاو تاتش السماء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top