Objective c 自定义UIMenuItem仅第一次显示
我在视图控制器的Objective c 自定义UIMenuItem仅第一次显示,objective-c,ios,cocoa-touch,uimenucontroller,uimenuitem,Objective C,Ios,Cocoa Touch,Uimenucontroller,Uimenuitem,我在视图控制器的-(void)viewDidLoad方法中添加了一个自定义菜单: UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)]; [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem]; 在同一控制器中,我
-(void)viewDidLoad
方法中添加了一个自定义菜单:
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
在同一控制器中,我还实现了以下方法:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(readSelectedText)) {
if (textView.selectedRange.length > 0) {
return YES;
}
return NO;
}
return [super canPerformAction:action withSender:sender];
}
我第一次选择一些文本时,菜单包含“Read selected”(阅读选定内容)菜单项,一切正常。但是,在随后的文本选择中,菜单仅包含标准系统菜单项,如“复制”。粘贴等。我已使用sender:(id)sender方法签入-(BOOL)canPerformAction:(SEL)操作,并且它从未使用readSelectedText
操作调用过(与第一次一样)
知道为什么会发生这种情况吗?我已经尝试了下面的代码,它对我很有效。重点是在菜单显示之前,添加自定义菜单项,然后自己显示菜单
-(无效)viewDidLoad
{
[超级视图下载]
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidShow) name:UIMenuControllerDidShowMenuNotification object:nil];
}
-(无效)菜单显示{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];
}
-(无效)menuWillShow{
UIMenuItem *shareMenu = [[UIMenuItem alloc] initWithTitle:@"微博分享" action:@selector(shareToWeibo:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:shareMenu, nil]];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];
[菜单设置targetect:selectedRect-inView:self.view];
//必须设置,否则菜单位置从未更改
[menu setMenuVisible:YES animated:YES];
}我的解决方案基于邱方舟提供的建议,因此学分和接受的答案归他所有
无论如何,我最终订阅了我的viewDidLoad
方法中的uimenucontrollerwillshowmenonification
noritication:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuWillShow) name:UIMenuControllerWillShowMenuNotification object:nil];
然后我实现了这个方法:
-(void)menuWillShow{
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
}
诀窍在于,每次推菜单时都必须添加自定义菜单项,而不是只添加一次。我猜自定义菜单项列表每次都会被清除。对于可能仍需要此项的用户:
我们不需要观察UIMENUCONTROLEDHIDEMENINU化
viewdiapear:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidHide) name:UIMenuControllerWillShowMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];
viewdisaper:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuDidHide) name:UIMenuControllerWillShowMenuNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];
menudhide
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Read selected" action:@selector(readSelectedText)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObject:menuItem];
谢谢,这帮我解决了这个问题。但我已经简化了你的建议,并将解决方案作为替代答案发布。我不知道你的情况,但对我来说这已经足够了。我正在UIWebView上添加自定义菜单项。如果我没有自己设置MenuVisible(只设置MenuItems)。自定义项仍然不可见。