2011-11-10 23 views
47

TÔI ĐÃ ĐỌC tài liệu về táo và không dễ hiểu đối với người mới bắt đầu ở số Objective-C như tôi. Tôi đang cố gắng để thực hiện multicolumn UITableView sau đây ví dụ link và nó chỉ không hoạt động vì vậy tôi cần phải hiểu làm thế nào cellForRowAtIndexPath làm việc, gây cho cá nhân tôi phương pháp này có vẻ khá phức tạp.CellForRowAtIndexPath hoạt động như thế nào?

1) Nó trở lại là gì? UITableViewCell? Nhưng tại sao nó trông rất lạ?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • Đó là gì? Bạn có thể giải thích?

2) Làm cách nào để gọi và điều quan trọng hơn là tôi kết nối nó với một số UITableView ??? Nếu tôi có hai tên UITableView có tên firstTableViewsecondTableView và tôi muốn chúng khác nhau (để thực hiện cellForRowAtIndexPath khác nhau)? Làm thế nào anh có thể liên kết của tôi UITableViews này

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

phương pháp chấp nhận NSIndexPath, không UITableView. Tôi sẽ làm gì đây?

+0

Chỉ cần có cho câu hỏi này. Tôi biết đây là 6 tuổi, nhưng dù sao ... một phương pháp dụ được mô tả như thế này: '- (return_type) firstPartOfMethodName: (first_param_type) first_param secondPartOfMethodName: (second_param_type) second_param ...', trong đó 'return_type' là kiểu giá trị của phương thức trả về, 'first_param_type',' second_param_type', v.v. là các kiểu tham số được truyền cho phương thức, 'first_param',' second_param', v.v. là các biến thực tế được truyền cho phương thức và 'firstPartOfMethodName: secondPartOfMethodName : ... 'là tên (hoặc ** chữ ký **) của phương thức. –

Trả lời

36

1) Hàm trả về ô cho chế độ xem bảng có? Vì vậy, đối tượng trả về là loại UITableViewCell. Đây là những đối tượng mà bạn nhìn thấy trong các hàng của bảng. Hàm này về cơ bản trả về một ô, cho một khung nhìn bảng. Nhưng bạn có thể hỏi, làm thế nào các chức năng sẽ biết những gì tế bào trở lại cho những gì liên tiếp, mà được trả lời trong câu hỏi thứ 2

2) NSIndexPath về bản chất là hai things-

  • mục của bạn
  • của bạn hàng

Vì bảng của bạn có thể được chia cho nhiều phần và mỗi phần có hàng riêng, NSIndexPath này sẽ giúp bạn xác định chính xác phần nào và hàng nào. Cả hai đều là số nguyên. Nếu bạn là người mới bắt đầu, tôi sẽ nói chỉ thử một phần.

Nó được gọi nếu bạn triển khai giao thức UITableViewDataSource trong bộ điều khiển chế độ xem của bạn. Một cách đơn giản hơn là thêm một lớp UITableViewController. Tôi đề nghị điều này bởi vì nó có một số mã được viết cho bạn để dễ dàng thực hiện các chức năng có thể mô tả một bảng. Dù sao, nếu bạn chọn tự mình thực hiện giao thức này, bạn cần phải tạo đối tượng UITableViewCell và trả lại cho bất kỳ hàng nào. Hãy xem tham chiếu lớp của nó để hiểu tính khả dụng lại vì các ô được hiển thị trong khung nhìn bảng được tái sử dụng một lần nữa và một lần nữa (đây là một btw thiết kế rất hiệu quả).

Khi bạn có hai chế độ xem bảng, hãy xem phương pháp.Chế độ xem bảng được truyền cho nó, do đó bạn không gặp vấn đề gì liên quan đến điều đó.

92

tôi sẽ cố gắng và phá vỡ nó xuống (ví dụ từ documention)

/* 
* The cellForRowAtIndexPath takes for argument the tableView (so if the same object 
* is delegate for several tableViews it can identify which one is asking for a cell), 
* and an indexPath which determines which row and section the cell is returned for. 
*/ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    /* 
    * This is an important bit, it asks the table view if it has any available cells 
    * already created which it is not using (if they are offScreen), so that it can 
    * reuse them (saving the time of alloc/init/load from xib a new cell). 
    * The identifier is there to differentiate between different types of cells 
    * (you can display different types of cells in the same table view) 
    */ 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; 

    /* 
    * If the cell is nil it means no cell was available for reuse and that we should 
    * create a new one. 
    */ 
    if (cell == nil) { 

     /* 
     * Actually create a new cell (with an identifier so that it can be dequeued). 
     */ 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease]; 

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    } 

    /* 
    * Now that we have a cell we can configure it to display the data corresponding to 
    * this row/section 
    */ 

    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"]; 
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"]; 
    UIImage *theImage = [UIImage imageWithContentsOfFile:path]; 
    cell.imageView.image = theImage; 

    /* Now that the cell is configured we return it to the table view so that it can display it */ 

    return cell; 

} 

Đây là một phương pháp DataSource vì vậy nó sẽ được gọi vào bất cứ đối tượng đã tuyên bố mình là DataSource của UITableView. Nó được gọi khi xem bảng thực sự cần hiển thị ô trên màn hình, dựa trên số hàng và phần (mà bạn chỉ định trong các phương thức DataSource khác).

+0

Vì chuỗi này cung cấp thông tin về giao dịch tốt, tôi muốn thêm một chút thông tin có thể hữu ích. Phương pháp này cũng được gọi nếu bạn bắt đầu tải lại từ một số phần của mã của bạn. ví dụ. - (void) reloadRowsAtIndexPaths: (NSArray *) indexPaths withRowAnimation: (UITableViewRowAnimation) animation –

+0

Bạn không nên đặt 'cell.selectionStyle = UITableViewCellSelectionStyleNone;' ra khỏi khối if? Khi tôi đặt bên trong nó, nó không hoạt động. –

5

Về cơ bản nó thiết kế ô của bạn, Cellforrowatindexpath được gọi cho mỗi ô và số ô được tìm thấy bởi indexpath.row và số phần theo indexpath.section. Tại đây, bạn có thể sử dụng nhãn, nút hoặc hình ảnh được ghép nối bất cứ thứ gì bạn muốn được cập nhật cho tất cả các hàng trong bảng. trả lời cho câu hỏi thứ hai Trong tế bào cho hàng tại sử dụng con đường chỉ một câu lệnh if

Trong Objective C

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

NSString *CellIdentifier = @"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(tableView == firstTableView) 
    { 
     //code for first table view 
     [cell.contentView addSubview: someView]; 
    } 

    if(tableview == secondTableView) 
    { 
     //code for secondTableView 
     [cell.contentView addSubview: someView]; 
    } 
    return cell; 
} 

Trong Swift 3,0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell! 

    if(tableView == firstTableView) { 
    //code for first table view 
    } 

    if(tableview == secondTableView)  { 
    //code for secondTableView 
    } 

    return cell 
} 
+0

Bạn nên sử dụng tĩnh cho NSString * CellIdentifier = @ "CellIdentifier"; Đại biểu này là năng động, vì vậy bất cứ điều gì tĩnh phải được khai báo một cách chính xác. – GeneCode

+0

Nhưng chuỗi không thay đổi nó luôn luôn sẽ là "CellIdentifier" mỗi khi các tế bào tải và không phải cái gì khác để tế bào được tái sử dụng, chính xác cho tôi nếu tôi sai. – Koushik

+0

Chuỗi không thay đổi, đúng. Nhưng nó sẽ được tạo ra nhiều lần kể từ khi các đại biểu được gọi là rất nhiều lần. sử dụng tĩnh đảm bảo chuỗi được tạo ra một lần và được tái sử dụng. – GeneCode

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