2009-05-06 36 views
11

Tôi có một cấu trúc như thế này ....iphone - truy cập UITableViewController từ UITableViewCell

UITableViewController -> UITableViewCell -> UIView 

Tôi cần UIView để truy cập vào một Hashtable (NSMutableDictionary) trong UITableViewController

Có cách nào để truy cập ViewController chỉ đơn giản là từ ViewCell (sử dụng [ViewCell superview] rõ ràng sẽ không hoạt động) .... Tôi có cần phải đi xuống thông qua AppDelegate sử dụng [[UIApplication sharedApplication] delegate]?

Cảm ơn!

Trả lời

7

tôi thường duy trì một tham chiếu yếu từ UIView tôi để UIViewController nếu tôi cần một, thường bằng cách tạo ra một phương pháp như thế này:

-(MyView*)initWithController:(CardCreatorViewController*) aController andFrame:(CGRect)aFrame 
{ 
    if (self = [super initWithFrame:aFrame]) 
    { 
     controller = aController; 
     // more initialisation here 
    } 

    return self; 
} 

Bạn cũng có thể sử dụng một mô hình đại biểu nếu bạn muốn tách riêng một nhiều dung dịch. Tôi có xu hướng nghĩ rằng đây là quá mức cần thiết cho một cái nhìn và bộ điều khiển của nó, nhưng tôi sẽ sử dụng nó với một hệ thống các bộ điều khiển và các bộ điều khiển con.

4

Vì UITableViewCell ở đâu đó trong cấu trúc phân cấp khung nhìn, bạn có thể truy cập chế độ xem gốc của mình bằng cách truy xuất view.superview cho đến khi bạn nhận được nó. Nếu bạn không muốn thêm bất kỳ thuộc tính nào vào chế độ xem của mình, bạn có thể truy cập trình điều khiển của thuộc tính thông qua thuộc tính nextResponder của chế độ xem. Bạn sẽ phải bỏ nó vào bất kỳ lớp nào bạn cần, tất nhiên, và nó có thể không phải là việc sử dụng tài sản sạch sẽ nhất. Đó là một hack nhanh chóng-n-bẩn để có được nó.

Nếu bạn đang tìm kiếm thứ gì đó bạn có thể cho con mình xem, tôi muốn nhắm đến đại biểu ứng dụng của bạn, hoặc nếu bộ điều khiển xem của bạn là singleton, chỉ cần thực hiện mẫu thiết kế đơn và truy cập cái đó.

27

này nên làm như lừa:

UITableView *tv = (UITableView *) self.superview.superview; 
UITableViewController *vc = (UITableViewController *) tv.dataSource; 
+6

Tôi đang sử dụng iOS 5.0 và tính năng này không hoạt động trong dự án hiện tại của tôi, self.superview.superview là UIView chứ không phải UITableView ("[UIView dataSource]: bộ chọn không được công nhận"). – Max

+3

@ Không có gì trong tài liệu đảm bảo rằng các ô xem bảng sẽ là hai bản xem trước từ các chế độ xem bảng để câu trả lời này dựa trên hành vi không có giấy tờ. Nó không ngạc nhiên khi nó bị hỏng. – Tommy

+0

Bạn nên sử dụng: UITableView * tv = (UITableView *) tự.superview; –

4

Một số sửa đổi từ Kare Morstol câu trả lời:

Các hệ thống cấp bậc của tableviewcell là trong iOS 5.0 (phiên bản thử nghiệm của tôi)

cell.superview = tableview 
cell.superview.superview = UIViewControllerWrapperView 

Vì vậy, sử dụng cell.superview để xem bảng. Và tableview và tableviewController có một mối quan hệ của delegate, DataSource mặc định.
Bạn có thể nhận tham khảo tableviewController bằng tableview.delegate hoặc tableview.dataSource.

UITableView *tableView = cell.superview; 
UITableViewController *tableViewController = tableView.delegate; // or tableView.dataSource` 
7

Bạn có thể tạo ra một loại cho việc này:

@implementation UITableViewCell (FindTableViewController) 

- (id<UITableViewDataSource>)tableViewController 
{ 
    UIView *view = self; 
    while (!(view == nil || [view isKindOfClass:[UITableView class]])) { 
     view = view.superview; 
    } 

    return ((UITableView *)view).dataSource; 
} 

@end 

Sau đó, bạn có thể dễ dàng truy cập self.tableViewController từ tế bào thân (giả sử bạn đã bao gồm thể loại này). Bạn có thể cần phải đúc nó vào bảng điều khiển của lớp học của bộ điều khiển tho.

Các vấn đề liên quan