我正在开发一个支持在 UITextView 中编辑属性文本的应用程序。为了向用户提供格式化输入的工具,我使用 inputAccessoryView 来增加键盘的选项,例如项目符号列表、编号列表、缩进、取消缩进、字体控制(粗体、下划线、增加字体大小、减小字体大小)等. 这对于 inputAccessoryView 来说太多了,所以我希望使用 UIMenuController 来提供一种机制,为用户提供更多空间来表达他们的意图。
因此,我有一个带有“listAccessory”按钮的 inputAccessoryView。按下时,我想显示一个带有四个选项(项目符号、数字、增加缩进、减少缩进)的 UIMenuController。但是当我显示这个菜单时,它还包括“选择”、“全选”和“粘贴”。
我没有在我的 View 中定义任何这些方法(select:、selectAll: 或 paste: 在 UIResponderStandardEditActions 非正式协议(protocol)中定义)。我已经定义了 canPerformAction:withSender: 并且只为我的选择器响应"is"。
- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
{
DDLogInfo(@"canPerformAction: %@", NSStringFromSelector(selector));
if (selector == @selector(formatAsBulletList:)) return YES;
if (selector == @selector(formatAsNumberedList:)) return YES;
if (selector == @selector(formatIncreaseIndent:)) return YES;
if (selector == @selector(formatDecreaseIndent:)) return YES;
return NO; // return [super canPerformAction:selector withSender:sender];
}
当我记录在此代码中调用的选择器时,我没有看到任何对“select:”、“selectAll:”或“paste:”的请求,因此我相信 UIMenuController 代码正在测试这些方法直接调用 canPerformSelector() 针对类。
因为我没有在我的 viewController(派生自 UITableViewController)中实现这些功能,我只能相信 UIMenuController 正在查找响应者链并看到最初启动键盘的响应者是一个 UITextView,它确实支持选择、全选和粘贴。
所以我有几个问题:
1) 我对情况的理解正确吗?
2) 如何强制不显示这些菜单项?我能否在不关闭键盘的情况下以某种方式暂时中断响应链?
最佳答案
很酷的问题。问题出在您的理解上。当您尝试调用菜单时,UITextView 是第一响应者,因此它会使用 Select 和 Select All<> Action
一个解决方案是子类化 UITextView 并添加一个额外的属性,允许您短暂地阻止项目。
我试过了,它在 UITextField 上工作,因为它是我必须提交的,但没有理由相信它不会在 UITextView 上工作
轻松地对您的 View 进行子类化。
@interface CharlieDevTextView : UITextView
@property BOOL blockActionMenu;
@end
和
@implementation CharlieDevTextView
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (self.blockActionMenu) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}
@end
然后当你构造你的菜单时(假设你有一个 IBOutlet 到 textview)
-(void)yellowMellow:(id)sender {
}
-(void)createMenuForButton:(UIButton *)sender
{
UIMenuItem *newInstanceItem = [[UIMenuItem alloc] initWithTitle:@"Woot" action:@selector(yellowMellow:)];
[UIMenuController sharedMenuController].menuItems = @[newInstanceItem];
CGPoint apoint = sender.center;
self.charlieTextView.blockActionMenu = YES;
[[UIMenuController sharedMenuController] setTargetRect:CGRectMake(apoint.x,apoint.y, 0, 0) inView:sender.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
self.charlieTextView.blockActionMenu = NO;
}
或者听取 UIMenuControllerWillShowMenuNotification 和 UIMenuControllerDidHideMenuNotification 以打开和关闭阻止。
并且可能为了让它稍微不那么难看,创建一个委托(delegate)而不是一个属性。您的 View Controller 将成为委托(delegate)并判断它是要显示菜单还是注意到菜单已被取消。
基本相同的效果,不同的模式。
@protocol CharlieTextViewMenuDelegate <NSObject>
-(BOOL)shouldBlockMenu;
@end
@interface CharlieTextView : UITextView
@property (nonatomic,weak) id< CharlieTextViewMenuDelegate> menuDelegate;
@end
@implementation CharlieDevTextView
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if ([self.menuDelegate shouldBlockMenu]) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}
@end
关于ios - 在显示附加到 inputAccessoryView 的 UIMenuController 中隐藏 'select' 、 'selectAll' 、 'paste' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20001798/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="