เปลี่ยนความสูงของ UITableViewCell จากภายในคลาส UITableViewCell ที่สืบทอดมาเมื่อ UITextField ได้รับการโฟกัส

ฉันมีคลาส UITableViewCell ที่สืบทอดมาซึ่งฉันสร้างเซลล์แบบกำหนดเองที่มี UITextField

UITextField มีความสูง 25 พิกเซลโดยค่าเริ่มต้น

พฤติกรรมที่ฉันต้องการคือเมื่อผู้ใช้คลิกใน textField UITextField ควรเปลี่ยนเป็นความสูง 100 พิกเซล และเซลล์ควรเติบโตตามนั้น

ฉันสามารถตรวจจับได้ว่าเมื่อใดที่ UITextField ได้รับการโฟกัสด้วยการแจ้งเตือนและผู้สังเกตการณ์ แต่ฉันสงสัยว่าจะสร้าง tableView:HeightForCellAtindexPath: โดยทางโปรแกรมได้อย่างไร


person VdesmedT    schedule 03.12.2010    source แหล่งที่มา


คำตอบ (3)


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

@class CustomTableViewCell;

@protocol CustomTableViewCellDelegate 
- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell;
@end

@protocol (nonatomic, assign) id<CustomTableViewCellDelegate> delegate;

และเพียงเรียกวิธีการมอบหมายที่คุณตรวจพบเมื่อช่องข้อความได้รับการโฟกัส

[self.delegate customTableViewCellDidEnterTextMode:self];

และในตัวควบคุม

- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell {
  self.editingIndexPath = [self.tableView indexPathForCell:cell];
  // from Jablair's answer
  [tableView beginUpdates];
  [tableView endUpdates];
}

จากนั้นใน tableView:heightForCellAtIndexPath: ให้คืนส่วนสูงพิเศษของคุณสำหรับ self.editingIndexPath

คุณอาจต้องรวมวิธีการมอบสิทธิ์อื่นเพื่อทราบเมื่อโฟกัสออกจากฟิลด์ข้อความด้วย

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

สิ่งสำคัญที่สุด คุณต้องระบุลิงก์ระหว่างเซลล์และตารางในมุมมองตัวคุณเอง และฉันเชื่อว่าการใช้รูปแบบการมอบสิทธิ์เป็นแนวทางที่ดีที่สุด

person Robert Höglund    schedule 03.12.2010
comment
มันจะทำงานอย่างไรเนื่องจากมีการใช้อินสแตนซ์เซลล์เดียวกันสำหรับหลายแถว - person VdesmedT; 04.12.2010
comment
ไม่ อินสแตนซ์เดียวกันนี้จะใช้ครั้งละหนึ่งแถวเท่านั้น พวกมันจะถูกนำมาใช้ซ้ำ แต่ถ้าคุณมี 10 แถวที่มองเห็นได้บนหน้าจอ ก็จะมี 10 อินสแตนซ์ของเซลล์ที่แตกต่างกัน - person Robert Höglund; 04.12.2010
comment
ขอบคุณมาก. ฉันยังไม่ได้ลอง แต่ฉันรู้ว่ามันจะได้ผล และคำอธิบายล่าสุดของคุณช่วยให้ฉันเข้าใจว่าทำไม ! ขอบคุณ ! - person VdesmedT; 04.12.2010

ดังที่ Endemic กล่าวไว้ tableView:heightForCellAtIndexPath: คือวิธีการที่คุณต้องนำไปใช้ จากข้อมูลของ Apple วิธีที่มีประสิทธิภาพที่สุดในการกระตุ้นการปรับขนาดคือบล็อก beginUpdates / endUpdates ที่ว่างเปล่าเช่นนี้

[tableView beginUpdates];
[tableView endUpdates];

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

person Jablair    schedule 03.12.2010
comment
แต่ฉันจะเชื่อมโยงเหตุการณ์ที่เกิดขึ้นในคลาสที่สืบทอดมาจาก UITableViewCell และโค้ดนั้นได้อย่างไร มันเป็นคุณสมบัติหรือวิธีการใดที่ฉันสามารถตั้งค่า/เรียกใช้ในเซลล์ที่จะกระตุ้นให้เกิดเหตุการณ์ที่จะเกิดขึ้นใน tableViewController หรือไม่ - person VdesmedT; 03.12.2010

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

person Endemic    schedule 03.12.2010
comment
ฉันไม่มีการอ้างอิงถึง UITableView จากภายในเซลล์ดังนั้นโซลูชันนั้นจะบังคับให้ฉันโยงผู้รับมอบสิทธิ์ระหว่าง tableView และเซลล์ของมัน... จามรี ! ขอบคุณนะ. - person VdesmedT; 03.12.2010