ในกระดานเรื่องราวฉันจะสร้างเซลล์แบบกำหนดเองสำหรับใช้กับตัวควบคุมหลายตัวได้อย่างไร


216

ฉันกำลังพยายามใช้กระดานเรื่องราวในแอปที่ฉันกำลังทำงานอยู่ ในแอพนี้มีรายการและผู้ใช้และแต่ละรายการมีชุดสะสมอื่น ๆ (สมาชิกของรายการรายการที่ผู้ใช้เป็นเจ้าของ) ดังนั้นฉันมีListCellและUserCellชั้นเรียน เป้าหมายคือการให้ผู้ใช้สามารถใช้งานซ้ำได้ทั่วทั้งแอพ (เช่นในตัวควบคุม tableview ของฉัน)

นั่นคือสิ่งที่ฉันกำลังประสบปัญหา

ฉันจะสร้างเซลล์ tableview ที่กำหนดเองในสตอรี่บอร์ดที่สามารถนำกลับมาใช้ใหม่ได้ในตัวควบคุมมุมมองใด ๆ

นี่คือสิ่งเฉพาะที่ฉันได้ลองไปแล้ว

  • ใน Controller # 1 เพิ่มเซลล์ต้นแบบตั้งค่าคลาสเป็นUITableViewCellคลาสย่อยของฉันตั้งค่ารหัสนำมาใช้ใหม่เพิ่มป้ายชื่อและต่อสายเข้ากับช่องเสียบของชั้นเรียน ใน Controller # 2 เพิ่มเซลล์ต้นแบบที่ว่างเปล่าตั้งเป็นคลาสเดียวกันและใช้รหัสซ้ำเหมือนเดิม เมื่อมันทำงานป้ายกำกับจะไม่ปรากฏขึ้นเมื่อมีการแสดงเซลล์ในตัวควบคุม # 2 ทำงานได้ดีใน Controller # 1

  • ออกแบบแต่ละชนิดของเซลล์ใน NIB ที่แตกต่างกันและต่อสายเข้ากับระดับเซลล์ที่เหมาะสม ในกระดานเรื่องราวเพิ่มเซลล์ต้นแบบที่ว่างเปล่าและตั้งค่าคลาสและใช้รหัสซ้ำเพื่ออ้างอิงถึงชั้นเซลล์ ในviewDidLoadวิธีการของตัวควบคุมให้ลงทะเบียนไฟล์ NIB เหล่านั้นสำหรับรหัสที่ใช้ซ้ำ เมื่อแสดงเซลล์ในตัวควบคุมทั้งสองจะว่างเปล่าเหมือนต้นแบบ

  • เก็บต้นแบบในตัวควบคุมทั้งสองว่างและตั้งค่าคลาสและใช้ id ซ้ำกับคลาสเซลล์ของฉัน สร้าง UI ของเซลล์ทั้งหมดในโค้ด เซลล์ทำงานอย่างสมบูรณ์แบบในตัวควบคุมทั้งหมด

ในกรณีที่สองฉันสงสัยว่าต้นแบบจะมีผลเหนือกว่า NIB เสมอและถ้าฉันฆ่าเซลล์ต้นแบบการลงทะเบียน NIB ของฉันสำหรับรหัสที่ใช้ซ้ำจะทำงานได้ แต่จากนั้นฉันจะไม่สามารถตั้งค่าการแบ่งส่วนจากเซลล์ไปยังเฟรมอื่น ๆ ซึ่งเป็นจุดรวมของการใช้กระดานเรื่องราว

ในตอนท้ายของวันที่ฉันต้องการสองสิ่ง: wire wireview tableview ตามกระแสในกระดานเรื่องราวและกำหนดรูปแบบเซลล์สายตามากกว่าในรหัส ฉันไม่เห็นวิธีที่จะนำทั้งสองอย่างมาใช้

คำตอบ:


205

ตามที่ฉันเข้าใจคุณต้องการ:

  1. ออกแบบเซลล์ใน IB ซึ่งสามารถใช้ในฉากกระดานเรื่องราวได้หลายฉาก
  2. กำหนดค่ากระดานเรื่องราวที่ไม่ซ้ำกันแยกออกจากเซลล์นั้นขึ้นอยู่กับฉากที่มีเซลล์อยู่

น่าเสียดายที่ขณะนี้ยังไม่มีวิธีการทำเช่นนี้ เพื่อทำความเข้าใจว่าทำไมความพยายามครั้งก่อนของคุณไม่ทำงานคุณต้องเข้าใจเพิ่มเติมเกี่ยวกับการทำงานของสตอรีบอร์ดและตารางมุมมองต้นแบบ (หากคุณไม่สนใจว่าทำไมความพยายามอื่น ๆ เหล่านี้ไม่สามารถใช้งานได้โปรดอย่าลังเลที่จะออกตอนนี้ฉันไม่มีวิธีแก้ปัญหาที่น่าอัศจรรย์สำหรับคุณ

กระดานเรื่องราวคือในสาระสำคัญไม่มากไปกว่าการเก็บไฟล์. xib เมื่อคุณโหลดตัวควบคุมมุมมองตารางที่มีเซลล์ต้นแบบบางส่วนจากกระดานเรื่องราวนี่คือสิ่งที่เกิดขึ้น:

  • แต่ละเซลล์ต้นแบบนั้นเป็น mini-nib ที่ฝังตัวของมันเอง -[UITableView registerNib:forCellReuseIdentifier:]ดังนั้นเมื่อตัวควบคุมมุมมองตารางมีการโหลดขึ้นก็ไหลผ่านแต่ละไส้เซลล์ต้นแบบและการโทร
  • มุมมองตารางถามตัวควบคุมสำหรับเซลล์
  • คุณอาจจะโทร -[UITableView dequeueReusableCellWithIdentifier:]
  • เมื่อคุณร้องขอเซลล์ด้วยตัวระบุการใช้ซ้ำที่กำหนดเซลล์จะตรวจสอบว่ามีการลงทะเบียนปลายปากกาหรือไม่ ถ้าเป็นเช่นนั้นมันจะยกตัวอย่างของเซลล์นั้น นี้ประกอบด้วยขั้นตอนต่อไปนี้:

    1. ดูคลาสของเซลล์ตามที่กำหนดไว้ในปลายปากกาของเซลล์ โทร[[CellClass alloc] initWithCoder:].
    2. -initWithCoder:วิธีผ่านไปและเพิ่ม subviews และชุดคุณสมบัติที่ได้กำหนดไว้ในปลายปากกา ( IBOutletอาจติดอยู่ที่นี่เช่นกันแม้ว่าฉันจะไม่ได้ทดสอบสิ่งนั้น แต่อาจเกิดขึ้นได้-awakeFromNib)
  • คุณกำหนดค่าเซลล์ของคุณอย่างไรก็ตามคุณต้องการ

สิ่งสำคัญที่ควรทราบที่นี่คือมีความแตกต่างระหว่างคลาสของเซลล์และลักษณะที่ปรากฏของเซลล์ คุณสามารถสร้างเซลล์ต้นแบบสองเซลล์ที่แยกจากกันในคลาสเดียวกัน ในความเป็นจริงถ้าคุณใช้UITableViewCellสไตล์เริ่มต้นนี่คือสิ่งที่เกิดขึ้น ตัวอย่างเช่นสไตล์ "Default" และ "Subtitle" เป็นทั้งUITableViewCellคลาสเดียวกัน

นี้เป็นสิ่งสำคัญที่: ชั้นของเซลล์ไม่ได้มีความสัมพันธ์แบบหนึ่งต่อหนึ่งกับโดยเฉพาะอย่างยิ่งลำดับชั้นของมุมมอง ลำดับชั้นการดูถูกกำหนดโดยสิ่งที่อยู่ในเซลล์ต้นแบบที่ลงทะเบียนกับคอนโทรลเลอร์นี้โดยเฉพาะ

หมายเหตุเช่นกันว่าตัวระบุการใช้ซ้ำของเซลล์นั้นไม่ได้ลงทะเบียนในการจ่ายเซลล์บางส่วนของโลก ตัวระบุการใช้ซ้ำนั้นใช้ภายในบริบทของUITableViewอินสแตนซ์เดียวเท่านั้น


รับข้อมูลนี้มาดูสิ่งที่เกิดขึ้นในความพยายามข้างต้นของคุณ

ใน Controller # 1 เพิ่มเซลล์ต้นแบบตั้งคลาสเป็นคลาสย่อย UITableViewCell ของฉันตั้งค่ารหัสนำมาใช้ใหม่เพิ่มป้ายชื่อและต่อสายไปยังช่องของคลาส ใน Controller # 2 เพิ่มเซลล์ต้นแบบที่ว่างเปล่าตั้งเป็นคลาสเดียวกันและใช้รหัสซ้ำเหมือนเดิม เมื่อมันทำงานฉลากจะไม่ปรากฏขึ้นเมื่อมีการแสดงเซลล์ในตัวควบคุม # 2 ทำงานได้ดีใน Controller # 1

สิ่งนี้คาดว่า ในขณะที่เซลล์ทั้งสองมีคลาสเดียวกันลำดับชั้นการดูที่ส่งผ่านไปยังเซลล์ใน Controller # 2 นั้นไม่มีการแสดงตัวอย่างทั้งหมด ดังนั้นคุณมีเซลล์ว่างเปล่าซึ่งเป็นสิ่งที่คุณใส่ไว้ในต้นแบบ

ออกแบบแต่ละชนิดของเซลล์ใน NIB ที่แตกต่างกันและต่อสายเข้ากับระดับเซลล์ที่เหมาะสม ในกระดานเรื่องราวเพิ่มเซลล์ต้นแบบที่ว่างเปล่าและตั้งค่าคลาสและใช้รหัสซ้ำเพื่ออ้างอิงถึงชั้นเซลล์ของฉัน ในเมธอด viewDidLoad ของคอนโทรลเลอร์ให้ลงทะเบียนไฟล์ NIB เหล่านั้นสำหรับ id ที่ใช้ซ้ำ เมื่อแสดงเซลล์ในตัวควบคุมทั้งสองจะว่างเปล่าเหมือนต้นแบบ

คาดว่าจะเป็นเช่นนี้อีกครั้ง ตัวระบุการใช้ซ้ำนั้นไม่ได้ใช้ร่วมกันระหว่างฉากกระดานเรื่องราวหรือปลายปากกาดังนั้นความจริงที่ว่าเซลล์ที่แตกต่างเหล่านี้ทั้งหมดมีตัวระบุการใช้ซ้ำเดียวกันนั้นไม่มีความหมาย เซลล์ที่คุณได้รับกลับมาจากมุมมองตารางจะมีลักษณะที่ตรงกับเซลล์ต้นแบบในฉากของกระดานเรื่องราว

วิธีนี้ก็ใกล้กัน ดังที่คุณบันทึกไว้คุณสามารถโทร-[UITableView registerNib:forCellReuseIdentifier:]โดยใช้โปรแกรมส่งผ่านUINibเซลล์ที่มีอยู่แล้วและคุณจะได้รับเซลล์เดิมนั้นกลับมา (นี่ไม่ใช่เพราะต้นแบบถูก "แทนที่" ปลายปากกาคุณเพียง แต่ไม่ได้ลงทะเบียนปลายปากกาด้วย tableview ดังนั้นมันก็ยังมองปากกาที่ฝังอยู่ในกระดานเรื่องราว) โชคไม่ดีที่มีข้อบกพร่องในวิธีนี้ - ไม่มีวิธีใดที่จะเชื่อมโยงกระดานเรื่องราวเข้ากับเซลล์ในปลายปากกาแบบสแตนด์อโลน

เก็บต้นแบบในตัวควบคุมทั้งสองว่างและตั้งค่าคลาสและใช้ id ซ้ำกับคลาสเซลล์ของฉัน สร้าง UI ของเซลล์ทั้งหมดในโค้ด เซลล์ทำงานอย่างสมบูรณ์แบบในตัวควบคุมทั้งหมด

เป็นธรรมชาติ หวังว่านี่จะไม่แปลกใจ


นั่นคือสาเหตุที่มันไม่ทำงาน คุณสามารถออกแบบเซลล์ของคุณในไส้ปากกาแบบสแตนด์อโลนและใช้พวกมันในหลาย ๆ ฉากของกระดานเรื่องราว ปัจจุบันคุณไม่สามารถเชื่อมต่อกับกระดานเรื่องราวได้แยกออกเป็นเซลล์เหล่านั้น อย่างไรก็ตามหวังว่าคุณจะได้เรียนรู้บางสิ่งในขั้นตอนการอ่านนี้


อ่าฉันเข้าใจแล้ว คุณจับความเข้าใจผิดของฉัน - ลำดับชั้นการดูเป็นอิสระอย่างสมบูรณ์จากชั้นเรียนของฉัน เห็นได้ชัดในการหวนกลับ! ขอบคุณสำหรับคำตอบที่ดี
หน้าผา W

ดูเหมือนเป็นไปไม่ได้อีกต่อไปแล้ว: stackoverflow.com/questions/8574188/…
Rich Apodaca

7
@ RichApodaca ฉันพูดถึงวิธีการแก้ปัญหาในคำตอบของฉัน แต่มันไม่ได้อยู่ในกระดานเรื่องราว มันอยู่ในปลายปากกาแยก ดังนั้นคุณไม่สามารถต่อสายย่อยหรือทำเรื่องราวกระดานเรื่องราวอื่น ๆ ได้ ดังนั้นจึงไม่ได้ตอบคำถามเริ่มต้นทั้งหมด
BJ Homer

ในฐานะของ XCode8 วิธีแก้ปัญหาต่อไปนี้ดูเหมือนว่าจะทำงานได้ถ้าคุณต้องการโซลูชันกระดานเรื่องราวเท่านั้น ขั้นตอนที่ 1) สร้างเซลล์ต้นแบบของคุณใน tableview ใน ViewController # 1 และเชื่อมโยงกับคลาส UITableViewCell ที่กำหนดเองขั้นตอนที่ 2) คัดลอก / วางเซลล์นั้นในวิวทิวทัศน์ของ ViewController # 2 เมื่อเวลาผ่านไปคุณจะต้องจำไว้ว่าจะเผยแพร่การปรับปรุงไปยังสำเนาของเซลล์ด้วยตนเองโดยการลบสำเนาที่คุณทำในกระดานเรื่องราวและวางกลับในต้นแบบที่อัปเดต
jengelsma

คำตอบที่ดีฉันมีคำถามติดตามแม้ว่า:> "กระดานเรื่องราวคือในสาระสำคัญไม่มากไปกว่าชุดของไฟล์. xib" ถ้าเป็นกรณีนี้ทำไมมันจึงยากที่จะฝัง xib ใน กระดานเรื่องราว
willcwf

58

ทั้งๆที่มีคำตอบที่ยอดเยี่ยมโดย BJ Homer ฉันรู้สึกเหมือนฉันมีทางออก เท่าที่การทดสอบของฉันดำเนินไป

แนวคิด: สร้างคลาสที่กำหนดเองสำหรับเซลล์ xib ที่นั่นคุณสามารถรอเหตุการณ์สัมผัสและดำเนินการตามโปรแกรมได้ ตอนนี้สิ่งที่เราต้องการคือการอ้างอิงไปยังคอนโทรลเลอร์ที่ทำงานกับ Segue tableView:cellForRowAtIndexPath:วิธีการแก้ปัญหาของฉันคือการตั้งค่าใน

ตัวอย่าง

ฉันมีDetailedTaskCell.xibเซลล์ตารางที่ฉันต้องการใช้ในหลายมุมมองตาราง:

DetailedTaskCell.xib

มีคลาสที่กำหนดเองTaskGuessTableCellสำหรับเซลล์นั้น:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือสิ่งที่เวทมนตร์เกิดขึ้น

// TaskGuessTableCell.h
#import <Foundation/Foundation.h>

@interface TaskGuessTableCell : UITableViewCell
@property (nonatomic, weak) UIViewController *controller;
@end

// TashGuessTableCell.m
#import "TaskGuessTableCell.h"

@implementation TaskGuessTableCell

@synthesize controller;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSIndexPath *path = [controller.tableView indexPathForCell:self];
    [controller.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
    [controller performSegueWithIdentifier:@"FinishedTask" sender:controller];
    [super touchesEnded:touches withEvent:event];
}

@end

ฉันมีหลายส่วน แต่พวกเขาทั้งหมดมีชื่อเหมือนกัน: "FinishedTask". หากคุณต้องการยืดหยุ่นที่นี่ฉันแนะนำให้เพิ่มคุณสมบัติอื่น

ViewController มีลักษณะเช่นนี้:

// LogbookViewController.m
#import "LogbookViewController.h"
#import "TaskGuessTableCell.h"

@implementation LogbookViewController

- (void)viewDidLoad
{
    [super viewDidLoad]

    // register custom nib
    [self.tableView registerNib:[UINib nibWithNibName:@"DetailedTaskCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"DetailedTaskCell"];
}

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

    cell = [tableView dequeueReusableCellWithIdentifier:@"DetailedTaskCell"];
    cell.controller = self; // <-- the line that matters
    // if you added the seque property to the cell class, set that one here
    // cell.segue = @"TheSegueYouNeedToTrigger";
    cell.taskTitle.text  = [entry title];
    // set other outlet values etc. ...

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"FinishedTask"])
    {
        // do what you have to do, as usual
    }

}

@end

อาจมีวิธีที่สง่างามกว่านี้ในการทำสิ่งเดียวกัน แต่ - มันใช้งานได้! :)


1
ขอบคุณฉันใช้วิธีนี้ในโครงการของฉัน คุณสามารถแทนที่วิธีนี้แทนเพื่อให้คุณไม่ต้องรับ indexPath และเลือกแถวด้วยตัวเอง: - (เป็นโมฆะ) setSelected: (BOOL) เลือกภาพเคลื่อนไหว: (BOOL) เคลื่อนไหว {{super setSelected: เลือกเคลื่อนไหว: เคลื่อนไหว]; ถ้า (เลือก) [self.controller performSegueWithIdentifier: self.segue ผู้ส่ง: ตนเอง]; } ฉันคิดว่า super จะเลือกเซลล์เมื่อโทร [super touchesEnded: touches withEvent: event] ;. คุณรู้หรือไม่เมื่อมีการเลือกถ้าไม่มี
thejaz

9
โปรดทราบว่าด้วยวิธีนี้คุณจะเริ่มต้นการแบ่งทุกครั้งที่การสัมผัสสิ้นสุดลงในเซลล์ ซึ่งรวมถึงหากคุณเพียงแค่เลื่อนเซลล์ไม่ใช่พยายามเลือกเซลล์จริงๆ คุณอาจมีโชคดีเอาชนะ-setSelected:ในเซลล์และเรียกทำต่อเท่านั้นเมื่อเปลี่ยนจากการNO YES
BJ Homer

ฉันมีโชคที่ดีขึ้นด้วยsetSelected:BJ ขอบคุณ อันที่จริงมันเป็นวิธีที่ไม่เหมาะสม (มันรู้สึกผิด) แต่ในขณะเดียวกันมันก็ใช้งานได้ดังนั้นฉันจึงใช้มันจนกว่าจะได้รับการแก้ไข (หรือการเปลี่ยนแปลงบางอย่างในศาลของ Apple)
Ben Kreeger

16

ฉันกำลังค้นหาสิ่งนี้และฉันพบคำตอบนี้โดย Richard Venable มันใช้งานได้สำหรับฉัน

iOS 5 มีวิธีการใหม่บน UITableView: registerNib: forCellReuseIdentifier:

หากต้องการใช้ให้วาง UITableViewCell ในปลายปากกา มันจะต้องเป็นวัตถุรากเดียวในปลายปากกา

คุณสามารถลงทะเบียนไส้ปากกาหลังจากโหลด tableView ของคุณจากนั้นเมื่อคุณเรียกใช้ dequeueReusableCellWithIdentifier: ด้วยตัวระบุเซลล์มันจะดึงมาจากปลายปากกาเหมือนกับว่าคุณใช้เซลล์ต้นแบบสตอรีบอร์ดแล้ว


10

บีเจโฮเมอร์ให้คำอธิบายที่ยอดเยี่ยมเกี่ยวกับสิ่งที่เกิดขึ้น

จากมุมมองที่ใช้งานได้จริงฉันจะเพิ่มสิ่งนี้หากคุณไม่มีเซลล์ในฐานะ xibs และเชื่อมต่อ segues สิ่งที่ดีที่สุดในการเลือกคือการมีเซลล์เป็น xib - ช่วงการเปลี่ยนภาพนั้นง่ายกว่าการดูแลรักษามากกว่าโครงร่างของเซลล์และคุณสมบัติต่างๆ และชุดย่อยของคุณจะแตกต่างจากชุดควบคุมอื่น ๆ ของคุณอยู่ดี คุณสามารถกำหนด segue โดยตรงจากตัวควบคุมมุมมองตารางของคุณไปยังตัวควบคุมถัดไปและดำเนินการในรหัส .

หมายเหตุเพิ่มเติมคือการมีเซลล์ของคุณเป็นไฟล์ xib แยกช่วยป้องกันไม่ให้คุณสามารถเชื่อมต่อการกระทำใด ๆ ฯลฯ โดยตรงกับตัวควบคุมมุมมองตาราง (ฉันไม่ได้ทำสิ่งนี้ออกไปแล้ว - คุณไม่สามารถกำหนดเจ้าของไฟล์เป็นสิ่งที่มีความหมาย ) ฉันกำลังทำงานกับสิ่งนี้โดยการกำหนดโปรโตคอลที่ตัวควบคุมมุมมองตารางของเซลล์คาดว่าจะสอดคล้องและเพิ่มตัวควบคุมเป็นคุณสมบัติที่อ่อนแอเช่นเดียวกับผู้รับมอบสิทธิ์ใน cellForRowAtIndexPath


10

สวิฟท์ 3

BJ Homer ให้คำอธิบายที่ดีเยี่ยมมันช่วยให้ฉันเข้าใจแนวคิด ถึงmake a custom cell reusable in storyboardซึ่งสามารถใช้ใน TableViewController ใด ๆ ที่เราต้องmix the Storyboard and xibเข้าใกล้ สมมติว่าเรามีมือถือชื่อเป็นCustomCellซึ่งก็คือการที่จะใช้ในและTableViewControllerOne TableViewControllerTwoฉันทำมันเป็นขั้นตอน
1.ไฟล์> ใหม่> คลิกไฟล์> เลือก Cocoa Touch Class> คลิกถัดไป> ให้ชื่อชั้นเรียนของคุณ (ตัวอย่างCustomCell)> เลือก Subclass เป็น UITableVieCell> ทำเครื่องหมายที่ช่องสร้างไฟล์ XIB แล้วกดถัดไป
2.CellIdentifierปรับแต่งมือถือตามที่คุณต้องการและกำหนดตัวบ่งชี้ในการตรวจสอบแอตทริบิวต์สำหรับมือถือที่นี่เราจะตั้งเป็น ตัวระบุนี้จะถูกใช้ใน ViewController ของคุณเพื่อระบุและนำเซลล์กลับมาใช้ใหม่
3.ตอนนี้เราแค่ต้องregister this cellใน viewDidLoad. ไม่จำเป็นต้องมีวิธีการเริ่มต้นใด ๆ
4.ตอนนี้เราสามารถใช้เซลล์ที่กำหนดเองนี้ใน tableView ใด ๆ

ใน TableViewControllerOne

let reuseIdentifier = "CellIdentifier"

override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: reuseIdentifier)
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:reuseIdentifier, for: indexPath) as! CustomCell
    return cell!
}

5

ฉันพบวิธีโหลดเซลล์สำหรับ VC เดียวกันไม่ได้ทดสอบกับส่วนย่อย นี่อาจเป็นวิธีแก้ปัญหาสำหรับการสร้างเซลล์ในปลายปากกาแยก

สมมติว่าคุณมีหนึ่ง VC และ 2 ตารางและคุณต้องการออกแบบเซลล์ในสตอรี่บอร์ดและใช้ในทั้งสองตาราง

(เช่นตารางและเขตข้อมูลการค้นหาด้วย UISearchController ที่มีตารางสำหรับผลลัพธ์และคุณต้องการใช้เซลล์เดียวกันในทั้งสอง)

เมื่อผู้ควบคุมขอให้เซลล์ทำสิ่งนี้:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * identifier = @"CELL_ID";

    ContactsCell *cell = [self.YOURTABLEVIEW dequeueReusableCellWithIdentifier:identifier];
  // Ignore the "tableView" argument
}

และที่นี่คุณมีห้องขังของคุณจากกระดานเรื่องราว


ฉันลองสิ่งนี้และดูเหมือนว่ามันจะทำงานได้ดี แต่เซลล์จะไม่ถูกใช้ซ้ำ ระบบจะสร้างและยกเลิกการรวบรวมเซลล์ใหม่ทุกครั้ง
GilroyKilroy

นี้เป็นคำแนะนำที่เดียวกันกับที่สามารถพบได้ในการเพิ่มแถบค้นหาเพื่อดูตารางที่ด้วยสตอรี่บอร์ด หากคุณสนใจมีคำอธิบายเชิงลึกของโซลูชันนี้ที่นั่น (ค้นหาtableView:cellForRowAtIndexPath:)
Senseful

แต่นี่เป็นข้อความน้อยลงและตอบคำถาม
João Nunes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.