2011-04-21 2 views
16

Tôi muốn biết liệu nó có được phép sử dụng Nhiều UItableView trong cùng một Chế độ xem (tôi không thấy bất kỳ thứ gì trong số Apple's Human Interface Guidelines) và nếu được, Cách tải khác nhau DataSource trong viewDidLoad cho mỗi UITableView?Hai UITableView trong cùng một chế độ xem

+0

Hãy thử này, nơi bạn tìm thấy mẫu mã với lời giải thích đầy đủ của 2 phương pháp khác nhau để làm điều này: Xem câu trả lời của tôi trong http://stackoverflow.com/a/11789681/846372 – Soniya

Trả lời

5

Có thể. Vấn đề là mỗi UITableView sẽ sử dụng cùng một số UITableViewDataSourceUITableViewDelegate. Vì vậy, bạn phải xác định xem bảng nào bạn đang làm việc với từng phương thức ủy nhiệm cần thiết.

Ví dụ:

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

    // make bigger rows 

    if (tableView == myBigRowTableView) 
    { 
     // make bigger rows 
     return 127; 
    } else if (tableView == mySmallRowTableView) { 
     // make smaller rows 
     return 20; 
    } else { 
     return 30; 
    } 
} 
+2

Chỉ cần chắc chắc chắn bạn đang cung cấp một giá trị mặc định, hoặc bằng cách có một kiểu trả về mặc định ở cuối, hoặc bằng mệnh đề if cuối cùng của bạn, nếu không bạn sẽ nhận được các cảnh báo trình biên dịch. – Christian

+0

Điểm tốt. +1 Cảm ơn. – dredful

20

Bạn chắc chắn nhất có thể có nhiều quan điểm bảng. Bạn sẽ muốn chắc chắn rằng bạn giữ một con trỏ xung quanh để mỗi người, sau đó trong phương pháp nguồn dữ liệu của bạn, bạn sẽ làm một cái gì đó như thế này:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    if(tableView == tableViewOne) 
      return 5; 
    else //if (tableView == tableViewTwo) 
      return 3; 
} 

Đây sẽ là như nhau đối với tất cả các phương pháp đại biểu/nguồn dữ liệu, trong đó là lý do tại sao họ cung cấp cho bạn chế độ xem bảng dưới dạng tham số.

1

Để làm cho cuộc sống dễ dàng hơn, bạn có thể chuyển hai đại biểu khác nhau cho UITableView. Nếu bạn vượt qua trong cùng một đại biểu, bạn sẽ phải thực hiện rất nhiều câu lệnh if. Bằng cách tạo hai đại biểu khác nhau, nó sẽ cho phép mã của bạn trở nên sạch hơn rất nhiều.

+0

Điều này thường không phải là thực hành tốt nhất, vì bạn sẽ phải có nhiều lớp để làm điều này. Mã nên được đặt ở nơi nó có ý nghĩa nhất để đặt nó, không phải nơi nó sẽ lưu các lập trình đánh máy. – Christian

+3

@Christian, việc đặt mã trong một lớp khác không lưu được cách nhập. Tách mã được gọi là ** Encapsulation **. –

5

IMO giải pháp sạch sẽ là có một bộ điều khiển cho mỗi lần xem bảng.

Nếu bạn sử dụng một bộ điều khiển cho n tableview, bạn sẽ phải sử dụng if-statemenst ở nhiều nơi, trong

  • – numberOfSectionsInTableView:
  • – tableView:numberOfRowsInSection:
  • – tableView:titleForHeaderInSection:
  • ...

Về cơ bản, tất cả trong UITableViewDatasource-Prot các phương thức ocol mà bạn sẽ cần phải thực hiện.

Vì vậy, nếu bạn cần thay đổi thứ gì đó, bạn phải thay đổi nó ở nhiều nơi.

Nếu bạn sử dụng một lớp trình điều khiển cho một lần xem bảng, bạn sẽ không phải kiểm tra chút nào.

  1. viết một lớp điều khiển cho mỗi tableview, làm cho nó phù hợp với các giao thức UITableViewDatasource
    • thực hiện các phương pháp giao thức bạn sẽ cần.ít nhất
      • – numberOfSectionsInTableView:,
      • – tableView:numberOfRowsInSection:,
      • – tableView:cellForRowAtIndexPath:
  2. gọi -setDataSource: cho mỗi tableview đến một đối tượng của lớp điều khiển ngay

tôi đã viết một ví dụ mã: https://github.com/vikingosegundo/my-programming-examples/tree/master/TwoTableViews

TwoTableViewsViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    if (firstController == nil) { 
     firstController = [[FirstTVContoller alloc] init]; 
    } 
    if (secondController == nil) { 
     secondController = [[SecondTVController alloc] init]; 
    } 
    [firstTable setDataSource:firstController]; 
    [secondTable setDataSource:secondController]; 

    [firstTable setDelegate:firstController]; 
    [secondTable setDelegate:secondController]; 
    firstController.view = firstController.tableView; 
    secondController.view = secondController.tableView; 
} 
+0

Quạt lớn của phương pháp này. Sạch hơn và có tổ chức hơn. –

+9

Không cần phải gọi bộ điều khiển xem bổ sung và tải chế độ xem mới. Bạn có thể tạo 2 lớp chấp nhận và các giao thức khác mà bạn có thể cần cho các bảng của bạn. Tạo các đại biểu đó làm thuộc tính trên bộ điều khiển xem chính của bạn. Sau đó, hoặc trong mã hoặc trong một tệp XIB, bạn có thể chỉ định những người đó làm đại biểu và nguồn dữ liệu tương ứng cho 2 bảng của bạn. Nó tương tự như cách tiếp cận được nêu ở trên, nhưng không cần phải thêm độ phức tạp của nhiều bộ điều khiển và chế độ xem vào hệ thống phân cấp của bạn. – Michael

3

Bạn có thể đặt tag cho mỗi bảng. Sau đó, áp dụng cho điều kiện đó trong phương pháp ủy nhiệm xem bảng, ví dụ:

myTable.tag=12; 
1

Bạn có thể có nhiều chế độ xem bảng trong một chế độ xem. Thêm thẻ vào mỗi chế độ xem bảng và với việc sử dụng tableview.tag, bạn có thể tải dữ liệu vào các bản xem bảng một cách riêng biệt.

Ví dụ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    if (tableView.tag == x) { 
     //code to load table view with tag value x 

     } 
     else{ 
     //code to load second table 
     } 
     return cell; 

    }