4

Итак, я не уверен, что я что-то делаю здесь неправильно, но у меня есть UIViewController, на котором есть UICollectionView. В методе viewDidLoad UIViewController я делаю следующее: он не добавляет никаких настраиваемых пунктов меню во всплывающее окно, которое появляется.Невозможно заставить UIMenuController отображать пользовательские элементы

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 при любых обстоятельствах, но независимо от того, что, только вырезать, копировать и вставлять не будет отображаться.

Разве я не реализовал это полностью, или я не сделал это правильно? Спасибо, в расширенном, за любую помощь, которая может быть предоставлена.

P.S. - Я просмотрел столько примеров, сколько мог, по всему Google, и я не нашел ничего, что помогло.

ответ

3

Вы правильно. Невозможно настроить меню, которое появляется, когда вы долгое время нажимаете на ячейку представления таблицы или коллекцию.

Я обсуждаю эту проблему в своей книге:

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

Как я говорю, что, копировать, вырезать и вставлять единственные варианты, которые вы можете иметь. Вам нужно будет сделать меню из другого источника, если вы хотите его настроить.

EDIT: В версии моей книги 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

Эти подходы также переведены на Swift (не без каких-либо затруднений) в редакции iOS 8 моей книги.

+0

Да, у меня такое чувство, поэтому я изменил, как я использую его, чтобы показ 'UIActionSheet'. Как только у меня появится возможность сделать мой собственный просмотр коллекции, я, вероятно, воспользуюсь этим. Благодаря! –

+0

Также PLS файл ошибка с Apple. Это действительно глупое ограничение. – matt

+0

он работает, если вы так делаете, http://paulsolt.com/2012/11/uicollectionview-custom-actions-and-uimenucontroller/ ну, это было сделано в ios6 – DogCoffee

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]; 
+3

Это, к сожалению, не работает в классе UICollectionView. –

+0

@AndrewRiebe Вы нашли решение для класса UICollectionView? – Chintan

6

Я смог реализовать пользовательские меню на UICollectionViewCell, выполнив инструкции по этой ссылке (https://stackoverflow.com/a/13618212/2313416) с некоторыми импровизациями.

В моем UICollectionViewController я внедрил пользовательские пункты меню, добавив их в контроллер меню, как в ссылке.

Затем я осуществил следующие в UICollectionViewController:

- (BOOL)collectionView:(UICollectionView *)cv canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender { 
return NO; 
} 

- (BOOL)collectionView:(UICollectionView *)cv shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath { 
return YES; 
} 

- (void)collectionView:(UICollectionView *)cv performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender { 

NSLog(@"perform action:%@", NSStringFromSelector(action)); 
} 

В моей UICollectionViewCell, я осуществил подобное следующему:

- (BOOL)canBecomeFirstResponder { 
return YES; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 

if (action == @selector(onCustom1:)) { 
    return YES; 
} 

if (action == @selector(onCustom2:)) { 
    return YES; 
} 
return NO; 
} 

Эти действия должны быть такими же, как это реализовано в Сборнике контроллер.

Если вы хотите включить функции копирования или вставки, добавьте их в canPerformAction: а затем измените CollectionView :: canPerformAction: чтобы вернуть YES.

Возможно, это не лучший способ сделать это, но работал для меня.

+0

Это вызывает сбой, поскольку он не может найти 'onCustom1:' как вы его перенаправили в collectionView? –

+0

@RyanPoolos В представлении CollectionViewControllerDidLoad я создал NSArray пользовательских объектов UIMenuItems. Для своих действий я добавляю «@action (onCustom1 :)» и «@action (onCustom2 :)».В заголовочном файле UICollectionViewCell я объявил '- (void) onCustom1: (id) отправитель' и '- (void) onCustom2: (id) sender'. Затем методы были помещены в мой файл UICollectionViewCell.m. –

+0

О, хорошо. Я думал, вы нашли способ как-то перекреститься между ячейкой и коллекцией. –

Смежные вопросы