2010-03-16 28 views
12

Tôi đang cố sử dụng UITableView mà không cần sử dụng ngòi và không sử dụng UITableViewController.cách đặt đại biểu xem bảng

Tôi đã thêm một trường hợp UITableView đến một UIViewController như vậy

mytable = [[UITableView alloc] initWithFrame:CGRectMake(22, 207, 270, 233)]; 
[mytable setDelegate:self]; 
[self.view mytable]; 

Ngoài ra tôi đã thêm các phương pháp xem bảng dưới đây để UIViewController của tôi (cắt cho brevities rượu sake)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

Tôi nhận được một cảnh báo nói rằng UIViewController của tôi không thực hiện giao thức ủy quyền UITableView.

Whats cách chính xác để cho biết chế độ xem bảng nơi phương thức ủy nhiệm của nó là?

(Đây là nỗ lực đầu tiên của tôi tại cố gắng sử dụng một UITableView mà không chọn bộ điều khiển UITableTableview từ các tùy chọn tập tin mới)

Trả lời

29

Bạn cần phải phù hợp với lớp học của bạn để các giao thức UITableViewDelegateUITableViewDataSource. (cellForRowAtIndexPath: là trong giao thức UITableViewDataSource)

Làm điều này bằng cách sử dụng dấu ngoặc nhọn trong định nghĩa giao diện lớp học của bạn:

@interface myViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {...} 

Lý do tại sao bạn đang nhận được cảnh báo này ngay bây giờ và không trước khi bạn đang sử dụng một UITableViewController là bởi vì UITableViewController đã tuân thủ các giao thức này.

Vì vậy, về bản chất, UITableViewController chỉ là một lớp phù hợp với UITableViewDelegateUITableViewDataSource và có một thành viên phiên bản UITableView. Đó là khá nhiều.

Tất nhiên, nếu bạn chưa subclassing UITableViewController, sau đó bạn cần phải tự thiết lập các dataSourcedelegate của UITableView:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 
+0

o.k cảm ơn các bạn, điều đó làm cho lỗi biến mất. Tôi đoán sử dụng <..> là khi bạn muốn triển khai nhiều giao diện? Tôi vẫn còn có một vấn đề, không có phương pháp tableview của tôi đang nhận được gọi là. [table reloadData] không có hiệu lực và phương thức didSelectRowAtIndexPath của tôi không thực thi khi tôi bấm vào một ô. Bạn có thể nghĩ về bất cứ điều gì khác tôi có thể bị mất? – dubbeat

+1

Không sao, tôi cũng quên đặt nguồn dữ liệu cũng như đại biểu – dubbeat

1

Cảnh báo chỉ được nói với bạn rằng phần @interface bạn nên tuyên bố rằng bạn thực hiện các giao thức UITableViewDelegate:

@interface MyUIViewController : UIViewController <UITableViewDelegate> 
16

bạn cũng phải thiết lập các đại biểu dataSource tự:

[tableView setDelegate:self]; 
[tableView setDataSource:self]; 

hay, không kém:

tableview.delegate = self; 
tableview.dataSource = self; 
+0

Sự khác biệt là gì? – RGriffiths

+1

@RichardGriffiths Sự khác biệt hoàn toàn là phong cách. Cả hai đều là người định cư và hoàn thành điều tương tự. –

1
[tableview setDataSource:self] 

Bạn cần phải cung cấp cho nó chắc chắn, Tại sao vì hai cần phương pháp UITableView dưới UITableViewDataSource giao thức.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
0

Trong Swift3 đây là cách bạn thiết lập UITableViewDelegate:

class FeedsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var feedsTableView: UITableView! 
     override func viewDidLoad() { 
      super.viewDidLoad() 

      feedsTableView.delegate = self 
      feedsTableView.dataSource = self 

      // Do any additional setup after loading the view. 
     } 
} 
Các vấn đề liên quan