Я решил эту дилемму, создав подкласс UITextView, чтобы предоставить способ переопределить nextResponder и отключить встроенные действия (Вставить), например, так:
@interface CustomResponderTextView : UITextView
@property (nonatomic, weak) UIResponder *overrideNextResponder;
@end
@implementation CustomResponderTextView
@synthesize overrideNextResponder;
- (UIResponder *)nextResponder {
if (overrideNextResponder != nil)
return overrideNextResponder;
else
return [super nextResponder];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (overrideNextResponder != nil)
return NO;
else
return [super canPerformAction:action withSender:sender];
}
@end
Затем вваш обработчик жестов, проверьте, является ли текстовое представление уже первым респондентом.Если это так, пусть он переопределит следующий респондент;в противном случае клавиатура, вероятно, в любом случае скрыта, и вы можете просто becomeFirstResponder
.Вам также придется сбросить переопределение, когда меню скрывается:
if ([inputView isFirstResponder]) {
inputView.overrideNextResponder = self;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(menuDidHide:)
name:UIMenuControllerDidHideMenuNotification object:nil];
} else {
[self becomeFirstResponder];
}
- (void)menuDidHide:(NSNotification*)notification {
inputView.overrideNextResponder = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIMenuControllerDidHideMenuNotification object:nil];
}
Использование методов делегирования табличного представления, представленных в iOS 5 (shouldShowMenuForRowAtIndexPath
и т. Д.), Не было для меня решением, так как мне было нужноуправление позиционированием меню (по умолчанию оно просто центрировано по горизонтали над ячейкой, но я отображаю пузырьки сообщений и хочу, чтобы меню центрировалось по фактическому пузырю).