2012-03-28 6 views
19

Trong ứng dụng của tôi, tôi có một lớp con UITableViewCell tùy chỉnh bật lên bộ chọn khi được nhấn. từ bây giờ tôi sẽ tham khảo lớp học này là PickerCell. Tôi đang sử dụng một số trường hợp của PickerCell trong cùng một UITableView.Mục tiêu C - Cách triển khai phương thức gọi lại tùy chỉnh nhưng thực thi tham số cụ thể?

Tôi không muốn ô phản hồi việc chọn một hàng trong bộ chọn, vì đó không phải là MVC tốt. Thay vào đó, tôi muốn ViewController cung cấp cho ô một cuộc gọi lại sẽ được gọi khi lựa chọn hàng.

Cách rõ ràng nhất là tạo giao thức như PickerCellDelegate và trình điều khiển chế độ xem sẽ tự truyền cho mỗi ô.

Vấn đề của tôi với phương pháp này là kể từ khi tôi có một vài PickerCells, thực hiện của tôi về giao thức trong ViewController sẽ phải phân biệt giữa mỗi tế bào:

-(void) pickerCell : (PickerCell *) sender 
     didSelectRow : (NSInteger) row 
     inComponent : (NSInteger) component 
{ 
    if (sender == X) 
    // Something 
    else if (sender == Y) 
    // Something else... 
    // etc... 
} 

Tôi ghét kiểu mã hóa này ...

Thay vào đó, tôi thực sự muốn một cơ chế cho phép ViewController cung cấp gọi lại riêng của nó.

Tôi có thể cho phép PickerCell chấp nhận "onRowSelectedSelector", nhưng làm cách nào để đảm bảo rằng bộ chọn này có định dạng mà tôi muốn? (Số thông số là quan trọng nhất)

Thậm chí tốt hơn, tôi muốn cung cấp cho ô Picker khối để thực hiện lựa chọn, vì tôi biết các khối có thể được xác định với các thông số cụ thể. Ngoài ra, không cần phải truyền đối tượng "đích".

Vậy làm cách nào để tôi thực hiện việc như vậy?

Cảm ơn!

Trả lời

33

đây là làm thế nào để sử dụng khối callback

typedef void(^PickerCallback)(NSInteger row, NSInteger component); 

@interface PickerCell 

@property (nonatomic, copy) PickerCallback callback; 

@end 

@implementation PickerCell 

@synthesize callback; 

- (void)whatever { 
    // when you want to call the callback block 
    if (self.callback) { 
     self.callback(row, component); 
    } 
} 

@end 

và gán khối gọi lại sau khi tế bào chọn tạo

PickerCell *cell = // create a picker cell 
cell.callback = ^(NSInteger row, NSInteger component) { 
    // inside callback 
}; 
+0

Tuyệt vời! Chính xác những gì tôi đang tìm kiếm! –