Хорошо, я решил это. Решение не очень красивое, и лучший вариант — «Apple устраняет проблему», но это, по крайней мере, работает.
Прежде всего, добавьте к селекторам действий UIMenuItem префикс "magic_". И не делайте соответствующих методов. (Если вы можете это сделать, то вам все равно не нужно это решение).
Я создаю свои UIMenuItems таким образом:
NSArray *buttons = [NSArray arrayWithObjects:@"some", @"random", @"stuff", nil];
NSMutableArray *menuItems = [NSMutableArray array];
for (NSString *buttonText in buttons) {
NSString *sel = [NSString stringWithFormat:@"magic_%@", buttonText];
[menuItems addObject:[[UIMenuItem alloc]
initWithTitle:buttonText
action:NSSelectorFromString(sel)]];
}
[UIMenuController sharedMenuController].menuItems = menuItems;
Теперь ваш класс, который перехватывает сообщения о нажатии кнопки, нуждается в нескольких дополнениях. (В моем случае класс является подклассом UITextField. У вас может быть что-то другое.)
Во-первых, метод, который мы все хотели иметь, но которого не существовало:
- (void)tappedMenuItem:(NSString *)buttonText {
NSLog(@"They tapped '%@'", buttonText);
}
Затем методы, которые делают это возможным:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
NSString *sel = NSStringFromSelector(action);
NSRange match = [sel rangeOfString:@"magic_"];
if (match.location == 0) {
return YES;
}
return NO;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
if ([super methodSignatureForSelector:sel]) {
return [super methodSignatureForSelector:sel];
}
return [super methodSignatureForSelector:@selector(tappedMenuItem:)];
}
- (void)forwardInvocation:(NSInvocation *)invocation {
NSString *sel = NSStringFromSelector([invocation selector]);
NSRange match = [sel rangeOfString:@"magic_"];
if (match.location == 0) {
[self tappedMenuItem:[sel substringFromIndex:6]];
} else {
[super forwardInvocation:invocation];
}
}
person
sobri
schedule
26.03.2012