2009-05-30 32 views

Trả lời

26

Bạn cần triển khai phương thức xử lý sự kiện UIControl trên bộ điều khiển chế độ xem của mình và đặt điều đó làm bộ điều khiển cho tất cả các nút của bạn. ví dụ: trong chức năng -tableView:cellForRowAtIndexPath: của bạn, bạn sẽ làm điều gì đó như:

[theCell.button addTarget: self 
        action: @selector(buttonPressed:withEvent:) 
     forControlEvents: UIControlEventTouchUpInside]; 

Sau đó xử lý sự kiện của bạn sẽ trông như thế này:

- (void) buttonPressed: (id) sender withEvent: (UIEvent *) event 
{ 
    UITouch * touch = [[event touches] anyObject]; 
    CGPoint location = [touch locationInView: self.tableView]; 
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location]; 

    /* indexPath contains the index of the row containing the button */ 
    /* do whatever it is you need to do with the row data now */ 
} 
+6

chỉnh sửa nhẹ ... [chạm sự kiện] phải là [event allTouches] – dizy

+0

tuyệt vời! đây chính xác là những gì tôi đang tìm kiếm ... cảm ơn .. – mshsayem

6

Phương pháp sau đây được gọi là khi bạn chọn một ô trong tableView của bạn:

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

để truy cập số phần: int section = indexPath.section;

để truy cập số liên tiếp (trong vòng đúng phần): int row = indexPath.row;

+2

Đó là không được gọi khi người dùng chạm vào một nút trên một hàng; nó chỉ được gọi nếu họ chạm vào chính nền hàng. –

8

Một vài suy nghĩ:

Bạn có thể lặp qua hệ thống phân cấp SuperView của nút cho đến khi bạn tìm thấy một UITableViewCell, sau đó gọi - (NSIndexPath *) indexPathForCell: (UITableViewCell *) tế bào trên UITableView.

- (void)buttonClicked:(id)sender { 
    UIView *button = sender; 

    for (UIView *parent = [button superview]; parent != nil; parent = [parent superview]) { 
    if ([parent isKindOfClass: [UITableViewCell class]]) { 
     UITableViewCell *cell = (UITableViewCell *) parent;   
     NSIndexPath *path = [self.tableView indexPathForCell: cell]; 

     // now use the index path 

     break; // for 
    } 
    } 
} 

Bạn có thể luân phiên sử dụng thẻ của nút để lưu trữ chỉ mục tham chiếu hàng. Điều này chỉ giữ một số nguyên duy nhất, do đó, nó có ý nghĩa nhất khi bạn có một phần duy nhất hoặc khi bạn đang quản lý các hàng của mình dưới dạng danh sách phẳng.

Bạn có thể luân phiên phân lớp UITableViewCell để đóng gói nút. UITableViewCell của bạn có thể đáp ứng với các sự kiện nút và phát lại một sự kiện cho đại biểu của riêng mình, đi qua tự. Người đại diện sự kiện sau đó có thể gọi - (NSIndexPath *) indexPathForCell: (UITableViewCell *) ô trên UITableView để có được đường dẫn chỉ mục.

1

Add dụ biến của UITableViewCell subclassTo của bạn có thể lưu trữ các đường chỉ số của tế bào:

NSIndexPath *myIndexPath; 

Khi bạn tạo các tế bào trong:

cellForIndexPath: 

vượt qua trong indexPath đến vừa được tạo ra/tái chế tế bào.

Bây giờ, khi bạn nhấn nút, chỉ cần đọc đường dẫn chỉ mục từ ivar của ô của bạn.

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