2012-03-31 22 views
12

Tôi có vấn đề hơi kỳ lạ và tôi không thể hiểu được mình đang thiếu gì. Tôi có một UITableView có thể chỉnh sửa tại chỗ (tức là khi giao diện người dùng của tôi được tải, tôi gửi bảng của tôi setEditing: YES animated: YES message). Hàng cuối cùng trong bảng được dự định là hàng "Thêm mới". Tất cả các hàng ngoại trừ hàng cuối cùng trong bảng của tôi có thể được di chuyển xung quanh. Không thể xóa các hàng nào.Không thể di chuyển các hàng trong UITableView ngay cả khi trình thu thập đang hiển thị

Các hàng hiển thị chính xác và các trình đơn hiển thị ở phía bên phải của tất cả các hàng ngoại trừ hàng cuối cùng (như dự định). Vấn đề là tôi không thể di chuyển các hàng. Khi tôi gõ vào các grabber để di chuyển hàng, nó loại jiggles tại chỗ, nhưng tôi không thể kéo nó lên hoặc xuống. Sau đây là đoạn có liên quan của mã:

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return UITableViewCellEditingStyleNone; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    Item *item = [self.itemArray objectAtIndex:fromIndexPath.row]; 
    [self.itemArray removeObjectAtIndex:fromIndexPath.row]; 
    [self.itemArray insertObject:item atIndex:toIndexPath.row]; 
} 

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { 
    if ([proposedDestinationIndexPath row] < [self.itemArray count]) { 
     return proposedDestinationIndexPath; 
    } 
    NSIndexPath *betterIndexPath = [NSIndexPath indexPathForRow:[self.itemArray count]-1 inSection:0]; 
    return betterIndexPath; 
} 

Mở cố gắng để gỡ lỗi, có vẻ như rằng tableView: moveRowAtIndexPath: được gọi là gần như ngay lập tức ngay cả khi tôi đang tổ chức sang grabber (tức là tôi đã không nhấc ngón tay của tôi chưa). Hơn nữa, tableView của tôi: targetIndexPathForMoveFromRowAtIndexPath: proposalDestinationIndexPath: không được viện dẫn chút nào.

Bất kỳ suy nghĩ nào về những gì tôi đang làm sai? Bất kỳ đề xuất nào về những gì tôi nên cố gắng khắc phục vấn đề này?

+0

Bản sao có thể có của [Không thể kéo UITableViewCell từ vị trí hiện tại của nó khi sắp xếp lại] (http://stackoverflow.com/questions/9251735/cant-drag-uitableviewcell-from-its-current-position-when-reorder) – Daniel

Trả lời

22

Tôi có vấn đề này quá. Kiểm tra xem bạn có một UIGestureRecognizer (đối với tôi nó là một UIPanGestureRecognizer) được gắn vào giám sát của UITableView. Tôi gỡ bỏ nó và sắp xếp lại công việc.

+0

Vâng, đó chính xác là vấn đề khi tôi cuối cùng đã tìm ra. – Umair

1

Phương pháp tableView:moveRowAtIndexPath:toIndexPath: không được gọi ngay khi chạm vào điều khiển. Từ số UITableViewDataSource Protocol Reference:

Đối tượng UITableView gửi thông báo này đến nguồn dữ liệu khi người dùng nhấn điều khiển sắp xếp lại từRow.

Vì vậy, đây là hành vi mong đợi.

Tôi tin rằng sự cố nằm trong số tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: của bạn. Bạn có một lý do cụ thể để bao gồm phương pháp này? Bạn đã thử bỏ nó ra và đi với vị trí được đề xuất chưa?

Ví dụ, có vẻ như ([proposedDestinationIndexPath row] < [self.itemArray count]) sẽ luôn luôn trả true ...

+0

Thậm chí thoát khỏi bảngView: targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath: phương pháp không giải quyết được sự cố. Mục đích của phương thức này là hàng cuối cùng (hàng "Thêm mới") không được di chuyển và không thể di chuyển các hàng khác bên dưới nó. – Umair

2

Gần đây tôi đã gặp vấn đề tương tự và chuỗi này chỉ cho tôi đúng hướng, nhưng cách tiếp cận tốt hơn là sử dụng phương thức ủy nhiệm của trình nhận dạng cử chỉ gestureRecognizerShouldBegin: để xác định xem bạn có đang trong tình huống bạn muốn xử lý hay không .

Trong trường hợp của tôi, tôi đã có cử chỉ vuốt trên bộ điều khiển chế độ xem chính và đang hiển thị bảng trong bộ điều khiển chế độ xem con. Trong gestureRecognizerShouldBegin: Tôi trả về NO khi bộ điều khiển xem con đang hoạt động, cho phép bảng xem mọi cử chỉ và bộ điều khiển xem bộ chứa không xử lý bất kỳ thứ gì.

28

Tôi gặp sự cố tương tự và @wilsontgh & Phản hồi @Andy đã đưa tôi đi đúng hướng. Tuy nhiên tôi không thể đủ khả năng loại bỏ các PanRecognizer cần thiết từ superview, cũng không vô hiệu hóa nó trong quan điểm nhất định. Điều gì làm việc cho tôi là đặt cài đặt này trên trình nhận dạng chế độ xem chính, giúp tránh các lần chạm bị xử lý đối với các chế độ xem/nhận dạng khác.

panRecognizer.cancelsTouchesInView = NO; 
+1

Đây là một giải pháp tuyệt vời cho một tình huống * rất * khó chịu. Tôi đã sử dụng ViewDeck mà quản lý một phong cách tràn Facebook/menu điều hướng và vì vậy nhận dạng cử chỉ pan trong khung nhìn cha mẹ đã tàn phá với bộ nhận dạng cử chỉ của tableview. Chúc mừng. – NSTJ

+3

Để sửa ViewDeck tôi đã có thể thiết lập 'panningCancelsTouchesInView' thành false trong bữa ăn tối dành cho người chiến thắng của người chiến thắng của tôi 'IIViewDeckController' –

+0

Winner !! – xximjasonxx

0

Trong trường hợp của tôi, đó là tính năng "ẩn thanh điều hướng khi vuốt" khiến đơn đặt hàng bị lỗi.Do đó hãy chắc chắn rằng nó bị tắt nếu bạn cần tính năng sắp xếp lại UITableView.

navigationController?.hidesBarsOnSwipe = false

Lưu ý rằng điều khiển chuyển hướng được chia sẻ trên tất cả các điều khiển quan điểm của điều hướng cùng chồng, do đó một màn hình có thể ảnh hưởng đến tất cả những người khác ngay cả sau khi đẩy/hoạt động pop-ing.

0

Trong trường hợp của tôi, sự cố nằm trong thuộc tính keyboardDismissMode.

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