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)。自定义项仍然不可见。