我正在尝试在UITextView中的“复制”、“粘贴”项旁边添加菜单项。我已经创建了UITextView的一个子类,并复制了苹果文档中的示例:
我只是在IB中创建了一个UiTextView,并将它的类设置为我的CustomTextView类。不幸的是,这不起作用。但是,如果我将我的CustomTextView设置为UIView的子类,它会工作得很好。这里有帮助吗?
我在这里也做了一个非常简单的例子项目:
apps.popsweet.com/TextViewTrial.zip
发布于 2010-07-20 11:15:52
所以我最终使用了以下代码来得到我想要的结果,我把下面的代码块放在我的视图控制器的viewDidLoad方法中,就像Alex所暗示的那样:
- (void)viewDidLoad {
[super viewDidLoad];
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
[menuItem release];
}
然后,我在视图控制器中添加了以下内容,以便在我命名为“textView”的UITextView中选择文本时有条件地显示项目:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(changeColor:)) {
if (textView.selectedRange.length > 0) {
return YES;
}
}
return NO;
}
我选择将canPerformAction:方法放在视图控制器中,而不是放在自定义的UITextView类中,因为这样其他选项(如复制、剪切、粘贴等)。由于该方法在响应器链上的每个对象上都会被调用,因此它们的行为与正常情况一样。
发布于 2010-07-19 16:19:16
通过执行以下操作,我只能创建一个自定义菜单项,该菜单项始终显示在弹出菜单中:
- (void) setUpCustomMenu {
Class cls1 = NSClassFromString(@"UIMenuController");
Class cls2 = NSClassFromString(@"UIMenuItem");
if (cls1 && cls2)
if ([UIMenuController instancesRespondToSelector:@selector(setMenuItems:)]) {
UIMenuItem* item1 = [[UIMenuItem alloc] initWithTitle:@"My Menu Item" action:@selector(myMenuAction:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:item1, nil];;
[item1 release];
}
}
这在视图控制器的viewDidLoad中调用。
我仍然在努力让它只有条件地显示我的菜单项(例如,如果有选择的话),通过拦截调用菜单控制器的事件。到目前为止我还不能做到这一点。
https://stackoverflow.com/questions/3267296
复制相似问题