さて、私はこれを解決しました。解決策はきれいではなく、より良い選択肢は「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];
}
}