2015-01-02 4 views
2

Я реализую пользовательский UIMenuController и пытаюсь выяснить. Как я могу юридически отключить «Копировать» и «Определить» UIMenuItems UIMenuController в UITextfield? Текстовое поле не редактируется. Я попытался отключить «Копировать» с помощью:Как отключить копирование и определение UIMenuItems UIMenuController в UITextfield

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(copy:)) 
    { 
     return NO; 
    } 

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


- (IBAction)tapTextViewGesture:(id)sender { 

    UIMenuItem *myItem1 = [[UIMenuItem alloc] initWithTitle:@"myItem1" action:@selector(myItem1Pressed:)]; 
    UIMenuItem *myItem2 = [[UIMenuItem alloc] initWithTitle:@"myItem2" action:@selector(myItem2Pressed:)]; 
    UIMenuItem *myItem3 = [[UIMenuItem alloc] initWithTitle:@"myItem3" action:@selector(myItem3Pressed:)]; 

    // Access the application's shared menu 
    UIMenuController *menu = [UIMenuController sharedMenuController]; 

    [menu setMenuItems:[NSArray arrayWithObjects:myItem1,myItem2,myItem3, nil]]; 

    CGRect menuRect = CGRectMake(20, 50, 200, 0); 


    // Show the menu from the cursor's position 
    [menu setTargetRect:menuRect inView:self.view]; 


    [menu setMenuVisible:YES animated:YES]; 
} 

Но меню все еще показывает «Копировать» и «Определить» UIMenuItems. Как я могу отключить их, оставив только мои предметы?

ответ

4

Наконец решил ее подклассов UITextView (созданный пользовательский класс для него) и просто добавил

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

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

    return NO; 
} 

внутри .m файл моего пользовательского TextView подкласса.

После этого «Копия» больше не появляется, с [menu update] или без;

+0

Как вы это достигли? Xcode говорит, что это частный метод, и его нельзя удалить из меню (на самом деле он его удалил, но когда я попытался архивировать проект и загрузить его в appstore - я просто не могу - ошибка появилась и сказала, что я использовал частный метод Appe, где я не должен). –

+0

Этот код не работает для меня. Я пробовал в iOS 9.1, 8.3. его по-прежнему выдает опцию «Вставить». Пожалуйста, помогите мне с любым другим решением – Balu

0

Добавьте это после того, как вы установите пункты меню

[menu update]; 

Я надеюсь, что это решает ваш запрос. :)

+1

Добавлено: '[menu update];' Показывает "Копировать". – Adelmaer

1

Вы можете сделать это путем создания класса путем подкласса UITextField класса и переопределения его метода canPerformAction::.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    // Returning 'NO' here disables all actions on textfield 
    return NO; 
} 
1

Реализация этого метода экземпляра в viewController.m:

**- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if ([_targetTextField isFirstResponder]) { 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO]; 
     }]; 
    } 
    return [super canPerformAction:action withSender:sender]; 
}** 

Этот метод проверяет, является ли целевой текстовое поле является первым ответчиком или нет. Если это так, NSOperationQueue создает отдельный поток для операции sharedMenuController, устанавливает видимость и анимацию как нет, так что он не может работать для копирования, вставки и т. Д. Оператор return вызывает метод canPerformAction метода UIResponder для его информирования для его реализации.