2012-10-15 95 views
8

我有一個簡單的基於UICollectionView的應用程序 - 一個UICollectionView和一個基於NSMutableArray的數據模型。通過NSNotification從UICollectionView中刪除單元格

我可以通過didSelectItemAtIndexPath沒有問題刪除單元格:委託方法:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ 
    [self.data removeObjectAtIndex:[indexPath row]]; 
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; 
} 

不過,我試圖通過UIMenuControllerUICollectionViewCell子類,可以通過UILongPressGestureRecognizer觸發添加刪除選項,所有工作正常,我成功地觸發NSNotification

-(void)delete:(id)sender{ 
     NSLog(@"Sending deleteme message"); 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"DeleteMe!" object:self userInfo:nil]; 
} 

我趕上它在我的ViewController並調用下面的方法:

-(void)deleteCell:(NSNotification*)note{ 
     MyCollectionViewCell *cell = [note object]; 
     NSIndexPath *path = nil; 
     if((path = [self.collectionView indexPathForCell:cell]) != nil){ 
      [self.data removeObjectAtIndex:[path row]]; 
      [self.collectionView deleteItemsAtIndexPaths:@[path]]; 
     } 
} 

而且它崩潰的deleteItemsAtIndexPaths:致電

-[UICollectionViewUpdateItem action]: unrecognized selector sent to instance 0xee7eb10 

我檢查一切顯而易見的 - 就像從NSNotification對象,並從indexPathForCell創建的indexPath:打電話,這一切似乎完全罰款。看起來我正在調用deleteItemsAtIndexPath:在兩個地方都有相同的信息,但由於某種原因,它在通過通知路由時失敗。

(lldb) po 0xee7eb10 
(int) $1 = 250080016 <UICollectionViewUpdateItem: 0xee7eb10> index path before update (<NSIndexPath 0x9283a20> 2 indexes [0, 0]) index path after update ((null)) action (delete) 

更新或許被空之後的索引路徑是顯著...

任何想法:

這是在地址信息錯誤給?

+0

在'deleteCell:'你用'self.collectionViewOne'和'self.collectionView' - 是故意的嗎? –

+0

對不起 - 這是錯字。 – melps

+0

我可以確認這從插入通知的新項目時也會發生。 – Brett

回答

25

我發現原油,但工作的解決方法,它甚至檢查行動,在未來的版本(除一類更好)已經實施

// Fixes the missing action method when the keyboard is visible 
#import <objc/runtime.h> 
#import <objc/message.h> 
__attribute__((constructor)) static void PSPDFFixCollectionViewUpdateItemWhenKeyboardIsDisplayed(void) { 
    @autoreleasepool { 
    if ([UICollectionViewUpdateItem class] == nil) return; // pre-iOS6. 
    if (![UICollectionViewUpdateItem instancesRespondToSelector:@selector(action)]) { 
      IMP updateIMP = imp_implementationWithBlock(^(id _self) {}); 
      Method method = class_getInstanceMethod([UICollectionViewUpdateItem class], @selector(action)); 
      const char *encoding = method_getTypeEncoding(method); 
      if (!class_addMethod([UICollectionViewUpdateItem class], @selector(action), updateIMP, encoding)) { 
       NSLog(@"Failed to add action: workaround"); 
      } 
     } 
    } 
} 

編輯:對於iOS5的補充檢查。
編輯2:我們正在很多商業項目(http://pspdfkit.com)中發貨,它的效果很好。

+1

這個答案對我來說就像一個魅力。應該標記爲解決方案。 –

+0

thxs,爲我工作。順便說一句,當我設置一個單元格內的視圖作爲第一響應者,並且沒有鍵盤可見 –

+0

有人有一個最小的例子是什麼原因造成的?我正在遇到另一個應用程序崩潰,而不顯示鍵盤或更改第一響應者。 –

0

您可以傳入userInfo字典中的選定單元格的NSIndexPath。您可以在創建自定義單元格的tag時將其設置爲。

+0

但這不是NSIndexPath錯誤的問題,所以我不確定這會有什麼幫助。 – melps

0

我有同樣的問題。在我選擇了放置在collectionViewCell中的UITextField中的文本之後,我嘗試將單元格插入到UICollectionView中時,我的應用程序會崩潰。我的修復是在插入發生之前辭退第一個響應者。由於我使用的是NSFetchedResultsController處理更新我把這個在controllerWillChangeContent:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [[UIApplication sharedApplication].keyWindow findAndResignFirstResponder]; 
    ... 
} 

開始,我發現findAndResignFirstResponderfrom this SO answer

相關問題