5

したがって、ここで何か間違っているかどうかはわかりませんが、UICollectionView を持つ UIViewController があります。UIViewController のviewDidLoadメソッドでは、表示されるポップアップにカスタム メニュー項目を追加しません。

UIMenuItem *removeItem = [[UIMenuItem alloc] initWithTitle:@"Remove" action:@selector(handleRemoveItem:)];
UIMenuItem *duplicateItem = [[UIMenuItem alloc] initWithTitle:@"Duplicate" action:@selector(handleDuplicateItem:)];

[[UIMenuController sharedMenuController] setMenuItems:@[removeItem, duplicateItem]];

[removeItem release];
[duplicateItem release];

collectionView:shouldShowMenuForItemAtIndexPath:すべての状況でとがcollectionView:canPerformAction:forItemAtIndexPath:withSender:返されるように設定しましたYESが、何があっても、切り取り、コピー、貼り付けのみが表示されます。

私はこれを完全に実装していませんでしたか、それとも正しく実装していませんでしたか?

PS - Google でできる限り多くの例を調べましたが、役立つものは何も見つかりませんでした。

4

3 に答える 3

4

あなたは正しいです。テーブル ビュー セルまたはコレクション ビュー セルを長押ししたときに表示されるメニューをカスタマイズすることはできません。

私は自分の本の中でこの問題について議論しています:

http://www.apeth.com/iOSBook/ch21.html#_table_view_menus

そこで言ったように、コピー、カット、ペーストしか選択肢はありません。メニューをカスタマイズする場合は、メニューを別のものから作成する必要があります。

編集:私の本の iOS 7 バージョンでは、これを行う方法を示しています。テーブル ビュー セルとコレクション ビュー セルの場合も同じなので、テーブル ビュー セル ソリューションから始めます。秘訣は、アクション メソッドをセル サブクラスに実装する必要があることです。たとえば、カスタム アクション セレクターがabbrev:の場合、セルをサブクラス化し、以下を実装する必要がありますabbrev:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch08p454tableCellMenus2/ch21p718sections/MyCell.m

それが唯一のトリッキーな部分です。次に、コントローラー クラスに戻り、abbrev:メニューに対して行うこととまったく同じことを行います。でshouldShowMenuForRowAtIndexPath:、カスタム メニューに追加します。次に、期待どおりに実装canPerformAction:します (一番下までスクロールします)。performAction:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch08p454tableCellMenus2/ch21p718sections/RootViewController.m

コレクション ビュー セルの並列実装: セル サブクラス:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch08p466collectionViewFlowLayout2/ch21p748collectionViewFlowLayout2/Cell.m

そしてコントローラー(一番下までスクロール):

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch08p466collectionViewFlowLayout2/ch21p748collectionViewFlowLayout2/ViewController.m

これらのアプローチは、私の本の iOS 8 版でも Swift に翻訳されています (多少の困難はありますが)。

于 2013-04-03T04:26:15.627 に答える
1

ステップ 1 : メニュー項目を作成する

UIMenuItem* miCustom1 = [[UIMenuItem alloc] initWithTitle:@"Custom 1" action:@selector(onCustom1:)];
UIMenuItem* miCustom2 = [[UIMenuItem alloc] initWithTitle: @"Custom 2" action:@selector(onCustom2:)];

ステップ 2: MenuController を作成する

UIMenuController* mc = [UIMenuController sharedMenuController];

ステップ 3 : メニュー コントローラーにアイテムを追加する

mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2, nil];

ステップ 4 : アイテムのアクション メソッドを作成する

- (void) onCustom1: (UIMenuController*) sender
{
}

- (void) onCustom2: (UIMenuController*) sender
{
}

ステップ 5 : 必要に応じて、アクションの FirstResponder を設定します

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector( onCustom1: ) )
    {
        return YES; // logic here for context menu show/hide
    }

    if ( action == @selector( onCustom2: ) )
    {
        return NO;  // logic here for context menu show/hide
    }

    if ( action == @selector( copy: ) )
    {
        // turn off copy: if you like:
        return NO;
    }

    return [super canPerformAction: action withSender: sender];
}

ステップ 6 : 最後に、いくつかのボタン アクションで MenuController を表示する

UIMenuController* mc = [UIMenuController sharedMenuController];

CGRect bounds = sender.view.bounds;

[mc setTargetRect: sender.view.frame inView:sender.view.superview];
[mc setMenuVisible:YES animated: YES];
于 2013-04-03T04:06:05.900 に答える