นี่คือวิธีแก้ปัญหาอื่นซึ่งแตกต่างกันเล็กน้อย
ฉันต้องใช้มันเนื่องจากปัญหามุมมองลำดับชั้นบางอย่างที่ฉันมี: ฉันกำลังสร้างฟังก์ชันบางอย่างที่จำเป็นต้องส่งมุมมองไปยังสถานที่ต่าง ๆ ในลำดับชั้นการดูซึ่งใช้งานไม่ได้เมื่อใช้มุมมองตารางของ UITableViewController self.view) และไม่ใช่แค่มุมมองปกติเท่านั้นมันสร้างลำดับชั้นควบคุม / มุมมองที่ไม่สอดคล้องกันและทำให้เกิดความผิดพลาด
โดยทั่วไปสร้างคลาสย่อยของคุณเองของ UITableViewController และแทนที่ loadView เพื่อกำหนดมุมมองที่แตกต่างกันของ self.view และแทนที่คุณสมบัติ tableView เพื่อส่งกลับ tableview แยกต่างหาก
ตัวอย่างเช่น:
@interface MyTableVC : UITableViewController
@end
@interface MyTableVC ()
@property (nonatomic, strong) UITableView *separateTableView;
@end
@implementation MyTableVC
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:CGRectZero];
}
- (UITableView *)tableView {
return self.separateTableView;
}
- (void)setTableView:(UITableView *)tableView {
self.separateTableView = tableView;
}
@end
เมื่อรวมกับโซลูชันของเคลเลอร์สิ่งนี้จะแข็งแกร่งขึ้นในแง่ที่ว่า tableView เป็นมุมมองปกติไม่ใช่มุมมองรูทของ VC และมีความทนทานต่อการเปลี่ยนแปลงลำดับชั้นของมุมมอง ตัวอย่างการใช้วิธีนี้:
MyTableVC *tableViewController = [[MyTableVC alloc] init];
tableViewController.tableView = self.myTableView;
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;
มีอีกการใช้ที่เป็นไปได้สำหรับสิ่งนี้:
เนื่องจากการแบ่งคลาสย่อยด้วยวิธีนี้แยก self.view ออกจาก self.tableView ตอนนี้จึงเป็นไปได้ที่จะใช้ UITableViewController นี้เป็นตัวควบคุมมากกว่าปกติและเพิ่มการดูย่อยอื่น ๆ ลงใน self.view โดยไม่ต้องแปลกประหลาดของการเพิ่มการดูย่อยลงใน UITableView ดูคอนโทรลเลอร์โดยตรง subclass ของ UITableViewController แทนการมีลูก UITableViewController
สิ่งที่ต้องระวัง:
เนื่องจากเรากำลังเอาชนะคุณสมบัติ tableView โดยไม่เรียก super อาจมีบางสิ่งที่ต้องระวังและควรจัดการในกรณีที่จำเป็น ตัวอย่างเช่นการตั้งค่า tableview ในตัวอย่างด้านบนของฉันจะไม่เพิ่ม tableview เป็น self.view และไม่ได้กำหนดเฟรมที่คุณอาจต้องการทำ นอกจากนี้ในการใช้งานนี้ไม่มี tableView เริ่มต้นที่กำหนดให้กับคุณเมื่อชั้นเรียนนั้นเป็นอินสแตนซ์ซึ่งเป็นสิ่งที่คุณอาจพิจารณาเพิ่ม ฉันไม่ได้รวมไว้ที่นี่เพราะเป็นกรณี ๆ ไปและวิธีการแก้ปัญหานี้เหมาะสมกับโซลูชันของเคลเลอร์