2012-04-23 21 views
6

UIControl - changing assigned selectors: addTarget & removeTargetTôi có nên removeTarget trước khi tôi addTarget

Hoa mà bạn nên loại bỏ các mục tiêu trước thay đổi khác. Tuy nhiên, nếu tôi đặt mục tiêu trong cellForRowAtIndexPath thì sao? Tôi có nên loại bỏ các mục tiêu trước khi thêm nó một lần nữa ngay cả khi nó không thay đổi? Nó sẽ gọi phương thức hai lần nếu tôi không xóa nó hay nó chỉ ghi đè lên nó?

[cell.cellSwitch removeTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged]; 
[cell.cellSwitch addTarget:self action:@selector(notifySwitchChanged:) forControlEvents:UIControlEventValueChanged]; 

Trả lời

0

Theo kinh nghiệm của tôi, nó sẽ chỉ được gọi một lần.

Nhưng IMO, tốt hơn nên sử dụngremoveTarget luôn vì mã có thể được thay đổi trong tương lai. Và một ngày nào đó, bạn có thể cần thêm nhiều mục tiêu và bộ chọn.

Hãy là mã an toàn, có thể mở rộng và có thể bảo trì.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = // code with reuse identifier ... 
    if(cell == nil) 
    { 
     // making view for cell .... 
    } 

    // myAction will be called ONLY ONCE after many times of scrolling 
    [cell.myButton addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside]; 

    return cell; 
} 
0

Thay vì thêm/xóa các mục tiêu, tôi đã phát hiện ra rằng nếu tôi đã subclassing UITableViewCell, tôi sẽ thêm một đại biểu mới và thiết lập các đại biểu với bộ điều khiển xem. Bằng cách đó, bất kỳ phương thức nào được gọi trên đại biểu đều có thể truyền trong toàn bộ ô và do đó tôi có thể nhận được đường dẫn chỉ mục của ô bằng cách gọi phương thức indexPathForCell của UITableView.

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