1. 程式人生 > >左滑tableview出現刪除按鈕

左滑tableview出現刪除按鈕

首先在tableView裡面實現cell的左滑刪除功能是挺簡單的,相信大家都懂得怎麼做。但是,當有多個tableView放在一個scrollView裡面的時候,會產生一系列的問題。

問題1:

      scrollView在滑倒最邊上(左或右)的時候,為了提醒使用者已經滑到最邊上了(左或右),再繼續向左(右)滾動的話會有一個反彈的效果,這就造成左滑刪除的時候,整個tableView會出現一個我們不想看到的反彈效果。

解決方法:

    會出現這種效果,是因為蘋果為了讓使用者知道scrollView已經滑到了最邊上了,而不是程式卡了或者出現問題了而不能滑動。所以,scrollView物件裡面有三個屬性,分別是bounces,bounceHorizontally與bounceVertically三個屬性,通過 self.scrollView.bounces = NO;這行程式碼就可以讓scrollView滑倒邊上的時候不會出現反彈效果。

關鍵程式碼:

self.scrollView.bounces = NO;

問題2:

      當你把scrollView滑到最邊上(左或右)的時候,當你繼續做滑想要讓cell接收左滑手勢的時候,這時滑動刪除的事件被底部的UIScrollview給響應了,cell根本拿不到這個滑動手勢。tableView是UIScrollview 的子類,cell裡面的ContentView好像在iOS7.0之後也是UIScrollview ,再加底部一個UIScrollview,這滑動手勢事件該怎麼傳遞好呢,給誰都不行啊。 給了底部,那麼就沒法滑動刪除,給了cell那麼正常的左右滑動又不行了。

解決方法:

首先,新建一個MyScrollView類,讓其繼承於UIScrollView,並且遵循UIGestureRecognizerDelegate協議。

@interface MyScrollview : UIScrollView <UIGestureRecognizerDelegate>

iOS的UIGestureRecognizer基類內包含 Tap(點選)、Pinch(捏合)、Rotation(旋轉)、Swipe(滑動)、Pan(拖移)、LongPress(長按)這幾種常用手勢動作,又細分單擊、雙擊、左滑、右滑等操作。

然後重寫下類方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

     if(gestureRecognizer.state != 0) {

     return YES;

}else {

     return NO;

}

重寫之後讓這個類繫結你介面中的scrollView.這個函式裡面的意思是如果一個手勢沒有被識別的話,那麼就讓多個gestureRecognizer可以被識別,也就是本文的scrollView與tableView的cell的滑動手勢可以同時被識別。

但是這樣之後,又會出現一個新的問題,也就是當scrollView在左右滑動的時候,tableView也能同時的上下滑動。造成這種現象的原因是上面MyScrollView裡面重寫的函式造成了多個手勢同時被響應。解決這種問題的方法是在ViewController類裡面處理滾動時候的事件。

#pragma mark - ScrollView delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

     if(scrollView == self.myScrollView) {

     self.tableView1.scrollEnabled = NO;

     self.tableView2.scrollEnabled = NO;

   } 

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if(scrollView == self.myScrollView) {

      self.tableView1.scrollEnabled = YES;

      self.tableView2.scrollEnabled = YES;

  }

}

程式碼的意思是當你在滑動scrollView的時候,把所有的tableView設定為不可滑動,而當scrollView滑動結束的時候,再把tableView設定為可以滑動,這樣就能避免scrollView與tableView同時滑動了。

好了,到此為止,為巢狀在scrollView裡面的tableView實現滑動刪除的功能所遇到的問題已經解決了。注意,這裡解決的是給右邊的tableView增加滑動刪除,如果你的需求是給左邊的tableView增加滑動刪除,那麼解決方案是:拿起鍵盤砸向產品經理。

下面給出實現滑動刪除常用到的方法。

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {

   return @"刪除";

}

該方法返回的是你左滑時候出現的文字提示。

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

  return UITableViewCellEditingStyleDelete;

}

該方法是根據indexPath返回tableView裡面每一行的編輯型別。包括UITableViewCellEditingStyleDelete,UITableViewCellEditingStyleNone與UITableViewCellEditingStyleInsert.

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

     UITableViewRowAction* deleteAction = [UITableViewRowAction       rowActionWithStyle:UITableViewRowActionStyleNormal title:@"刪除"  handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

這裡面寫點選按鈕的所響應的事件。

}];

 return @[deleteAction];

}

這個函式可以建立多個action,並以陣列的形勢返回,使得左滑時候能夠出現多個按鈕。

還有commitEditingStyle等等的函式,這裡就不一一例舉了。這裡附上自己的gitHub地址:github.com/juncheng785245941

今天就寫到這裡了,第一次用簡書,語言不當或者有錯誤的地方請多多指教,以後還會經常寫一些自己在iOS開發或者說是學習的時候遇到的問題與解決方法。我的目標是能讓所有程式猿更少的糾結於奇怪的bug,更少的熬夜,更輕鬆的程式設計。

      謝謝各位。