2014-05-16 15 views
5

My UITableView đã bật tính năng vuốt để xóa. Mỗi ô có một UIButton trên đó thực hiện một hành động (trong trường hợp này, thực hiện một segue).Vuốt để xóa ô không hủy hành động UIButton

Tôi mong rằng nếu tôi vuốt ô bằng cách chạm vào nút, thao tác của nút sẽ bị hủy/bỏ qua và chỉ thao tác vuốt sẽ được xử lý. Tuy nhiên, điều thực sự xảy ra là cả hai cử chỉ (swipe + tap) đều được phát hiện và xử lý.

Điều này có nghĩa là nếu tôi chỉ muốn xóa một ô và vuốt "vô tình" bằng cách chạm vào nút, ứng dụng sẽ chuyển sang màn hình tiếp theo.

Làm cách nào để buộc ứng dụng của tôi bỏ qua các lần nhấn trong trường hợp này?

Trả lời

9

tháng tám là đủ tốt đẹp cho tôi, nhưng tôi đã tìm ra cách để làm cho nó thậm chí còn tốt hơn:

Kiểm tra nếu bảng đã về chế độ chỉnh sửa để quyết định xem nút nên thực hiện hành động của nó sẽ làm cho nó hoạt động như bình thường, nhưng vẫn có một vấn đề trong trải nghiệm người dùng:

Nếu người dùng muốn thoát khỏi chế độ chỉnh sửa, anh ta có thể nhấn vào bất kỳ vị trí nào trong ô để đạt được điều đó, bao gồm cả nút. Tuy nhiên, hành động của UIButton vẫn được phân tích đầu tiên bởi ứng dụng và việc nhấn vào nút sẽ không thoát khỏi chế độ chỉnh sửa.

Các giải pháp tôi tìm thấy là để vô hiệu hóa tương tác người dùng của nút trong khi nhập chế độ chỉnh sửa, và reenabling nó khi nó được thực hiện:

// View with tag = 1 is the UIButton in question 
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:NO]; 
} 

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    [(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:1] setUserInteractionEnabled:YES]; 
} 

Bằng cách này, kéo nút để vào chế độ chỉnh sửa sẽ không kích hoạt hành động của nút và chạm vào nó để thoát khỏi chế độ chỉnh sửa thực sự sẽ thoát khỏi chế độ chỉnh sửa.

2

Một cách thanh lịch là bỏ qua các lần nhấn nút miễn là ô đã vào chế độ chỉnh sửa. Điều này hoạt động vì thao tác vuốt để xóa cử chỉ sẽ khiến willBeginEditingRowAtIndexPath được gọi trước khi thao tác nhấn nút được gọi. câu trả lời

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = YES; 
} 

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.isEditing = NO; 
} 

// button tapped 
- (IBAction)tap:(id)sender 
{ 
    if (self.isEditing) { 
     NSLog(@"Ignore it"); 
    } 
    else { 
     NSLog(@"Tap"); 
     // perform segue 
    } 
} 
+0

Cũng nghĩ! Ngoài ra, 'UITableView' đã có một thuộc tính flag' editing' (getter 'isEditing'), do đó không cần phải tạo một cái. – Guilherme

+0

Đó là sự giúp đỡ to lớn! –

2

Có thể để làm điều đó cũng trong lớp tế bào của bạn:

override func setEditing(editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 

    actionButton?.userInteractionEnabled = !editing 
} 
0

Bởi vì chức năng của tôi được gọi từ một nút bấm là một đại biểu vào chính lớp UITableViewController 's của tôi và kết nối với UITableViewCell như một IBAction, nút trong số UITableViewCell của tôi vẫn đang kích hoạt trên một lần vuốt có UIButton được nhấn như một phần của thao tác vuốt.

Để ngừng sử dụng cùng một số UITableView đại biểu làm câu trả lời được chấp nhận, nhưng phải đặt biến cấp tệp để theo dõi nếu việc chỉnh sửa diễn ra.

// in custom UITableViewCell class 
@IBAction func displayOptions(_ sender: Any) { 
    delegate?.buttonPress() 
} 

// in UITableViewController class that implemented delegate 
fileprivate var cellSwiped: Bool = false 

func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) { 
    cellSwiped = true 
} 

func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) { 
    cellSwiped = false 
} 

func displayContactsSheet(for contact: Contact) { 
    if cellSwiped { 
     return 
    } 
    // proceed with delegate call button press actions 
} 
Các vấn đề liên quan