2015-01-09 13 views
13

Hiện tại tôi đang sử dụng NSFetchedResultsController để xử lý các lần xem bảng. Tôi tự hỏi có cách nào để thêm các nút bổ sung như nút xóa trong thao tác vuốt không?thêm các nút bổ sung trong UITableView swipe

Tôi đang nghĩ đến việc phân lớp nó. Nhưng không tìm thấy gì liên quan trong tài liệu trợ giúp cho các vấn đề của tôi.

Xin cảm ơn trước.

Trả lời

46

Tiêu đề của bạn gây hiểu nhầm. NSFetchedResultsController không có liên quan đến mục tiêu cuối cùng của bạn. Phân lớp sẽ chỉ tạo ra nhiều công việc hơn mức cần thiết, những gì bạn muốn xem xét là UITableViewRowAction. Này xử lý rất dễ dàng & tương tự như mới UIAlertController, vì vậy bạn nên cảm thấy vô cùng thoải mái với điều này nếu bạn đã dabbled với UIAlertController

Một tóm tắt ngắn gọn (trực tiếp từ the docs) của UITableViewRowAction:

Hỏi các đại biểu cho các hành động hiển thị để phản hồi lại thao tác vuốt trong hàng được chỉ định. (bắt buộc) Sử dụng phương pháp này khi bạn muốn cung cấp các hành động tùy chỉnh cho một trong các hàng trong bảng của bạn. Khi người dùng vuốt theo chiều ngang trong một hàng, chế độ xem bảng sẽ di chuyển nội dung hàng sang một bên để tiết lộ hành động của bạn. Khai thác một trong các nút hành động thực thi khối xử lý được lưu trữ với đối tượng hành động. Nếu bạn không thực hiện phương pháp này, chế độ xem bảng sẽ hiển thị các nút phụ kiện tiêu chuẩn khi người dùng vuốt hàng.

Một vài ghi chú trước khi bạn bắt đầu:

  • của Apple thực hiện điều này trong iOS8: nên suy nghĩ cẩn thận về mục tiêu triển khai của bạn. Nếu bạn đang mã hóa nghiêm ngặt cho i0S8, đây là một sự thay thế nhanh chóng và dễ dàng cho các thư viện của bên thứ ba hoặc tạo một kiểu chỉnh sửa UITableView tùy chỉnh. Nếu bạn muốn duy trì tính tương thích cho iOS7, các tùy chọn của bạn bị giới hạn với định dạng này. SIDE NOTE điều này không gây ra lỗi nghiêm trọng trong mã của bạn, các ứng dụng iOS7 sẽ không bị lỗi, tuy nhiên, các hành động tùy chỉnh sẽ không hiển thị.
  • Có không nhiều tùy biến hơn danh hiệu
  • Các ưu điểm trong việc này, đó là tất cả mọi thứ được xử lý với các khối

Bất kể, để thực hiện một tùy chỉnh UITableViewRowAction trước tiên bạn phải đảm bảo bảng của bạn có thể chỉnh sửa bằng cách gọi các phương pháp sau:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Obviously, if this returns no, the edit option won't even populate 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Nothing gets called here if you invoke `tableView:editActionsForRowAtIndexPath:` according to Apple docs so just leave this method blank 
} 

Tối thiểu, đó là hai phương pháp cần được khai báo trước khi tiếp tục.

Để thực sự tùy chỉnh các nút hành động liên tiếp của bạn, hãy làm theo các hướng dẫn chung như sau:

Bước 1 thực hiện tableView:editActionsForRowAtIndexPath: phương pháp

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 
} 

Như bạn thấy, nó là một phương pháp thể hiện của loại NSArray , vì vậy bạn phải trả về một mảng.

BƯỚC 2 Thêm đối tượng hành động để chuyển vào mảng. Một ví dụ:

{ 

UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    // Delete something here 
}]; 

UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
{ 
    //Do whatever here : just as an example : 
    [self presentUIAlertControllerActionSheet]; 
}]; 

}  

Bạn có thể thay đổi một vài thuộc tính cho những hành động liên tiếp, nhưng xem các tài liệu cho các tùy chọn tùy biến hoàn toàn:

Để tùy chỉnh màu nền hành động hàng, chỉ cần phôi nó giống như hầu hết khác hành động trong các nút:

delete.backgroundColor = [UIColor redColor]; 
more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; //arbitrary color 

BƯỚC 3 Như đã đề cập trước khi bạn phải trả lại một mảng trong tôi phương pháp nstance do đó, mã hoàn chỉnh của bạn sẽ giống như sau:

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     // Delete something here 
    }]; 
    delete.backgroundColor = [UIColor redColor]; 

    UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
    { 
     //Just as an example : 
     [self presentUIAlertControllerActionSheet]; 
    }]; 
    more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; 

    return @[delete, more]; //array with all the buttons you want. 1,2,3, etc... 
}  

Để tham khảo thêm: LINK TO DOCUMENTATION


EDITED CHO SWIFT CÚ PHÁP

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? { 

var delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
delete.backgroundColor = UIColor.redColor() 

var more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in 
    //Do something 
}) 
more.backgroundColor = UIColor.blueColor() 

    return [delete, more] 
} 
+0

Cảm ơn gợi ý của bạn về chỉnh sửa tiêu đề. Nhưng trong thực tế, tôi đã cố gắng làm một cái gì đó về tùy biến NSFetchedResultsController để kích hoạt btns bổ sung. Câu trả lời của bạn cung cấp một giải pháp khác để khắc phục sự cố này nhưng không phải là sự cố gắng ban đầu của tôi. Một lần nữa cảm ơn câu trả lời của bạn. – AlexWei

+0

Có lẽ bạn có thể làm rõ sau đó @AlexWei Tôi sẵn sàng chỉnh sửa câu trả lời của mình. Lý do tôi nhầm lẫn là vì NSFetchedResultsController chỉ đơn giản lấy thông tin từ dữ liệu cốt lõi để hiển thị trong UITableView. Các nút hành động là một phần của UITableView không tìm nạp bộ điều khiển. Nếu bạn có thể đăng một liên kết tham khảo hoặc hình ảnh cho vấn đề của bạn tôi có thể hiểu rõ hơn để giúp bạn ra ngoài – soulshined

+1

Có vẻ như tôi hoàn toàn sai. Tôi đã không nhận ra "Các nút hành động là một phần của UITableView không lấy bộ điều khiển". Tôi nghĩ rằng các nút thuộc về bộ điều khiển tìm nạp. :( – AlexWei

10

Tất cả thanh danh cho @ linh hồn chấp nhận câu trả lời.

Dưới đây là phiên bản Swift 3 của nó:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let delete = UITableViewRowAction(style: .default, title: "Delete") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("delete at:\(indexPath)") 
    } 
    delete.backgroundColor = .red 

    let more = UITableViewRowAction(style: .default, title: "More") { (action:UITableViewRowAction, indexPath:IndexPath) in 
     print("more at:\(indexPath)") 
    } 
    more.backgroundColor = .orange 

    return [delete, more] 
} 
+0

Cảm ơn bạn đã chuyển đổi. – RichS

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