OK, tôi đã giải quyết vấn đề này. Giải pháp không phải là khá, và lựa chọn tốt hơn là "Apple sửa chữa vấn đề", nhưng điều này ít nhất là hoạt động.
Trước hết, hãy đặt tiền tố UIMenuItem bộ chọn hành động của bạn với "magic_". Và đừng tạo ra các phương thức tương ứng. (Nếu bạn có thể làm điều đó, sau đó bạn không cần giải pháp này anyway).
Tôi đang xây dựng tôi UIMenuItems như sau:
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;
Bây giờ lớp học của bạn mà bắt các thông điệp nút tap cần một vài bổ sung. (Trong trường hợp của tôi lớp là một lớp con của UITextField Yours có thể là cái gì khác..)
Đầu tiên, phương pháp mà tất cả chúng ta đã muốn có nhưng điều đó không tồn tại:
- (void)tappedMenuItem:(NSString *)buttonText {
NSLog(@"They tapped '%@'", buttonText);
}
Sau đó, các phương pháp mà làm cho nó có thể:
- (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];
}
}
Vì vậy, tôi đoán KHÔNG CÓ CÁCH để tạo các menu "mềm" trong IOS? – ort11