ตามที่ฉันเข้าใจคุณต้องการ:
- ออกแบบเซลล์ใน IB ซึ่งสามารถใช้ในฉากกระดานเรื่องราวได้หลายฉาก
- กำหนดค่ากระดานเรื่องราวที่ไม่ซ้ำกันแยกออกจากเซลล์นั้นขึ้นอยู่กับฉากที่มีเซลล์อยู่
น่าเสียดายที่ขณะนี้ยังไม่มีวิธีการทำเช่นนี้ เพื่อทำความเข้าใจว่าทำไมความพยายามครั้งก่อนของคุณไม่ทำงานคุณต้องเข้าใจเพิ่มเติมเกี่ยวกับการทำงานของสตอรีบอร์ดและตารางมุมมองต้นแบบ (หากคุณไม่สนใจว่าทำไมความพยายามอื่น ๆ เหล่านี้ไม่สามารถใช้งานได้โปรดอย่าลังเลที่จะออกตอนนี้ฉันไม่มีวิธีแก้ปัญหาที่น่าอัศจรรย์สำหรับคุณ
กระดานเรื่องราวคือในสาระสำคัญไม่มากไปกว่าการเก็บไฟล์. xib เมื่อคุณโหลดตัวควบคุมมุมมองตารางที่มีเซลล์ต้นแบบบางส่วนจากกระดานเรื่องราวนี่คือสิ่งที่เกิดขึ้น:
- แต่ละเซลล์ต้นแบบนั้นเป็น mini-nib ที่ฝังตัวของมันเอง
-[UITableView registerNib:forCellReuseIdentifier:]
ดังนั้นเมื่อตัวควบคุมมุมมองตารางมีการโหลดขึ้นก็ไหลผ่านแต่ละไส้เซลล์ต้นแบบและการโทร
- มุมมองตารางถามตัวควบคุมสำหรับเซลล์
- คุณอาจจะโทร
-[UITableView dequeueReusableCellWithIdentifier:]
เมื่อคุณร้องขอเซลล์ด้วยตัวระบุการใช้ซ้ำที่กำหนดเซลล์จะตรวจสอบว่ามีการลงทะเบียนปลายปากกาหรือไม่ ถ้าเป็นเช่นนั้นมันจะยกตัวอย่างของเซลล์นั้น นี้ประกอบด้วยขั้นตอนต่อไปนี้:
- ดูคลาสของเซลล์ตามที่กำหนดไว้ในปลายปากกาของเซลล์ โทร
[[CellClass alloc] initWithCoder:]
.
-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 ของเซลล์ทั้งหมดในโค้ด เซลล์ทำงานอย่างสมบูรณ์แบบในตัวควบคุมทั้งหมด
เป็นธรรมชาติ หวังว่านี่จะไม่แปลกใจ
นั่นคือสาเหตุที่มันไม่ทำงาน คุณสามารถออกแบบเซลล์ของคุณในไส้ปากกาแบบสแตนด์อโลนและใช้พวกมันในหลาย ๆ ฉากของกระดานเรื่องราว ปัจจุบันคุณไม่สามารถเชื่อมต่อกับกระดานเรื่องราวได้แยกออกเป็นเซลล์เหล่านั้น อย่างไรก็ตามหวังว่าคุณจะได้เรียนรู้บางสิ่งในขั้นตอนการอ่านนี้