8

シンプルなUICollectionViewベースのアプリがあります.1つのUICollectionViewとNSMutableArrayベースのデータモデルです。

didSelectItemAtIndexPath: デリゲート メソッドを使用して問題なくセルを削除できます。

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

UIMenuControllerただし、 a を介してトリガーされるUICollectionViewCellサブクラスの a を介して削除オプションを追加しようとしていますが、UILongPressGestureRecognizerこれはすべて正常に機能し、 a を正常にトリガーします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)

おそらく、更新後のインデックス パスが null であることは重要です...

何か案は?

4

3 に答える 3

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 のチェックを追加しました。
Edit2: 多くの商用プロジェクト ( http://pspdfkit.com ) でそれを出荷しており、うまく機能します。

于 2012-12-20T16:49:56.510 に答える
0

通知の辞書でNSIndexPath選択したセルの を渡すことができます。カスタムセルの作成時にそれをuserInfo設定できます。tag

于 2012-11-07T03:41:47.007 に答える