我正在尝试创建一个自定义的UIMenuController并在我的视图中显示它.这是我的代码:
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *listMenuItem = [[UIMenuItem alloc] initWithTitle:@"List" action:@selector(addList:)];
[menuController setMenuItems:[NSArray arrayWithObject:listMenuItem]];
[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];
[listMenuItem release];
Run Code Online (Sandbox Code Playgroud)
没有错误或异常,但菜单控制器只是没有出现.
我希望当我长按UITableViewCell以显示自定义UIMenuItem时弹出的UIMenuController.
我在viewDidLoad中设置了自定义项
UIMenuItem *testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];
[[UIMenuController sharedMenuController] setMenuItems: @[testMenuItem]];
Run Code Online (Sandbox Code Playgroud)
然后我设置所有正确的委托方法.
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
-(BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
return (action == @selector(copy:) || action == @selector(test:));
}
- (BOOL)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
if (action == @selector(copy:)) {
// do stuff
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
但它只是显示"复制"项目,因为我只允许它和我的自定义项目.但是,自定义项目不会显示.
我意识到,我可以为单元格本身添加一个手势识别器,但这种方式会破坏UIMenuController共享实例的目的,不是吗?
选择文本时,默认情况下会弹出UIMenuController,其中包含剪切/复制/粘贴等.
我想用我自己的自定义视图替换它(看起来相似,但两倍高,以便我可以有两行按钮/自定义视图).我怎样才能做到这一点?
我知道没有简单的方法.我期待如果有一个简单的解决方案,它将不会非常优雅.代码也不能使用任何私有API.
我真的,真的不必实现我自己的文本视图,重新实现文本选择和输入,并重新实现放大视图,这样我就可以编写自己的UIMenuController克隆,如果有任何方法可以避免它.应用程序的界面非常重要,我可以替换UIMenuController,所以如果没有其他答案,那么我可能最终会这样做.如果有人能为我节省大量时间并提出另一种更简单的方法,我将非常感激!
当您添加多个自定义菜单项时,显然有一种简单的方法可以防止"更多..."标签出现在UIMenuController中.您只需删除所有系统菜单项.这里甚至有一个解决方法,仍然有复制工作.您只需使用不同的选择器实现自定义复制命令,然后覆盖canPerformAction:withSender:不显示系统副本:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:))
return NO;
else
// logic to show or hide other things
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法不再有效(至少在UIWebView子类中).canPerformAction:withSender:为除copy之外的每个系统菜单项调用:因此结果是始终显示系统复制菜单项.这意味着如果您有多个自定义菜单项,它们始终隐藏在"更多..."后面
那么,有没有办法真正删除系统的复制项目或一些替代方法,以防止菜单项隐藏在"更多......"后面?
更新
这是我覆盖canPerformAction时得到的输出:withSender:注意该方法永远不会被调用为"copy:"动作:
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: …
Run Code Online (Sandbox Code Playgroud) 当用户在UIWebView上完成选择时,我想显示2个选项,如"hi"和"bye".
我已将观察者添加到我的视图控制器,如下所示.但我不知道进一步的实施.
[[UIMenuController sharedMenuController] addObserver:self
forKeyPath:UIMenuControllerWillShowMenuNotification
options:nil
context:nil
];
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码:
UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(100, 100, 100, 100) inView: self.view];
[menu setMenuVisible: YES animated: YES];
Run Code Online (Sandbox Code Playgroud)
菜单实例已准备就绪,但未显示 - 宽度始终为零.
或者是否有关于此UIPasteboard/UIMenuController
主题的示例代码?
我有一个WKWebView
并希望从编辑菜单中删除系统菜单项(复制,定义,共享...)并显示我自己的.
我的目标是iOS 8和9.我目前正在使用Xcode 7.0.1模拟器(iOS 9)和运行iOS 9.0.2的iPhone 6进行测试.
我知道实现这一目标的标准方法是通过子类化WKWebView
和实现
-canPerformAction:withSender:
.但是,我发现WKWebView
-canPerformAction:withSender:
没有被称为copy:
或define:
行动.这似乎是一个已知的错误(WKWebView和UIMenuController).
示例应用程序:https://github.com/dwieringa/WKWebViewCustomEditMenuBug
@implementation MyWKWebView
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"ACTION: %@", NSStringFromSelector(action));
if (action == @selector(delete:))
{
// adding Delete as test (works)
return YES;
}
// trying to remove everything else (does NOT work for Copy, Define, Share...)
return NO;
}
- (void)delete:(id)sender
{
NSLog(@"Delete menu item selected");
}
@end
Run Code Online (Sandbox Code Playgroud)
输出:(注意不行copy:
或 …
有没有办法确定UIMenuController何时被解雇?我有一个(不可编辑的)文本区域,我在菜单显示时突出显示,当他们选择一个项目(简单)或取消(不可能?)时,我想取消突出显示它.
我创建了一个UIMenuController并设置了一个自定义菜单项,如下所示:
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle:@"Do This" action:@selector(item1)];
[menuController setMenuItems:[NSArray arrayWithObject:item1]];
Run Code Online (Sandbox Code Playgroud)
但我希望该对象是唯一出现的对象,所以我添加了这段代码:
- (BOOL)canPerformAction: (SEL)action withSender: (id)sender {
BOOL answer = NO;
if (action == @selector(item1))
answer = YES;
return answer;
}
Run Code Online (Sandbox Code Playgroud)
问题是它仍然显示其他##标题##项目,例如"选择","全选"和"粘贴".这可能与在...中显示的内容有关UITextView
.但是,如果显示所有其他项目,我该如何停止?
我的应用程序正在使用 Firebase Analytics,我相信从 iOS 13.2 开始,开始出现此处描述的错误:为什么我收到控制台警告:[Process] kill() 当我在 iOS13.2 中加载 WKWebView 时返回了意外错误 1?
我想这没什么大不了的
由于我计划在 1 月份上线我的应用程序,因此我开始在物理设备上进行更大规模的测试。一段时间后,我注意到应用程序开始出现异常行为,特别是在收到[general] Connection to daemon is invalidated错误后。这不会发生在模拟器中
在互联网上搜索我发现了一篇描述相同问题的帖子:https : //forums.developer.apple.com/thread/124306
就我而言,似乎只有 Firebase 正在调用 WKWebView,但每次打开 UIMenuController 时,我都会收到控制台中描述的错误,并且应用程序似乎缺少输入。这对于 UIScrollViews 尤其麻烦,我的应用程序经常使用它。捏合手势似乎可以随意使用。在 iPhone 6s 上,这个问题不那么明显,在 iPad 上,捏合手势有 50% 的机会可以正常工作
除了删除 Firebase 之外,有没有办法缓解这个问题?
2020 年 6 月 1 日:控制台消息仍然存在,但是,我似乎通过停用 delaysContentTouches 解决了 UIScrollView 问题,现在捏合手势似乎在大部分时间都有效
2020 年 10 月 23 日如果有人注意到他们的应用程序开始出现无明显原因的不规则行为,我强烈建议尽可能在 iOS 13 物理设备上对其进行测试。似乎 Apple 从 iOS 14 中删除了警告,但在 iOS 13 上进行测试,您可以在控制台中出现警告后确定确切原因
uimenucontroller ×10
iphone ×6
cocoa-touch ×4
ios ×4
objective-c ×4
ipad ×2
firebase ×1
uikit ×1
uiscrollview ×1
uitableview ×1
uitextview ×1
uiwebview ×1
webkit ×1
wkwebview ×1
xcode ×1