我正在为我的应用程序制作一个登录屏幕,我希望返回按钮在有一个字段尚未填写时说“下一步”,当所有字段都已填写时它会说“开始”(我'我在谈论 UITextFields)。
下面的代码工作正常,因为它在正确的时刻显示 Next 和 Go。但每当它从“下一步”变为“开始”时,键盘上的下一次敲击就会被忽略。当它说“Go”并且我通过退格清空文本字段时,没有这样的问题并且它应该显示 Next 。就好像旧键盘还在那里,被敲击后就消失了。
我的问题是:这个问题的根源是什么,更重要的是,我该如何摆脱键盘卡住的问题?
UITextField *theSender = (UITextField *)sender;
if (allTextFieldsAreFilled) {
if (theSender.returnKeyType!=UIReturnKeyGo) {
theSender.returnKeyType = UIReturnKeyGo;
[theSender resignFirstResponder];
[theSender becomeFirstResponder];
}
} else {
if (theSender.returnKeyType!=UIReturnKeyNext) {
theSender.returnKeyType = UIReturnKeyNext;
[theSender resignFirstResponder];
[theSender becomeFirstResponder];
}
}
每次更改三个 UITextField 之一的值时都会调用此代码,因此它是一个连接到 Editing Changed 事件的 IBAction。
预先感谢您的帮助!
编辑
我发现只有当文本字段设置为安全(密码)时才会发生这种情况。当它未设置为安全时,它不会卡住并且我的代码可以完美运行!问题是当“安全”文本字段是第一响应者时,通常会发生对“开始”按钮的更改。所以这不会改变任何问题。
最佳答案
我创建了一个新的 Single View Application 项目来测试它;并将以下代码放入 ViewController.m
#import "ViewController.h"
@interface ViewController () <UITextFieldDelegate>
{
@private
IBOutlet UITextField* m_fieldA;
IBOutlet UITextField* m_fieldB;
IBOutlet UITextField* m_fieldC;
}
@end
@implementation ViewController
// connected to Editing Did Begin
- (IBAction) onFocus:(UITextField*)_textField
{
[self updateKeyboardFor:_textField];
}
// connected to Editing Changed
- (IBAction) onChanged:(UITextField*)_textField
{
[self updateKeyboardFor:_textField];
}
- (void) updateKeyboardFor:(UITextField*)_textField
{
bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length];
if (allTextFieldsAreFilled)
{
if (_textField.returnKeyType != UIReturnKeyGo)
{
_textField.returnKeyType = UIReturnKeyGo;
//[_textField resignFirstResponder];
//[_textField becomeFirstResponder];
[_textField reloadInputViews];
}
}
else
{
if (_textField.returnKeyType != UIReturnKeyNext)
{
_textField.returnKeyType = UIReturnKeyNext;
//[_textField resignFirstResponder];
//[_textField becomeFirstResponder];
[_textField reloadInputViews];
}
}
}
// A part of UITextFieldDelegate
- (BOOL) textFieldShouldReturn:(UITextField*)_textField
{
if (_textField.returnKeyType == UIReturnKeyGo)
{
[_textField resignFirstResponder];
// go off and perform 'go'
}
else
{
if(_textField == m_fieldA) [m_fieldB becomeFirstResponder];
if(_textField == m_fieldB) [m_fieldC becomeFirstResponder];
if(_textField == m_fieldC) [m_fieldA becomeFirstResponder];
}
return true;
}
@end
然后在 XIB 中创建三个 UITextFields 并将它们连接到 IBOutlets、IBActions,并将此 View Controller 设置为 delegate 所有字段。
无论安全字段如何,一切似乎都工作正常。
我的猜测是您的问题出在您移至“下一步”字段的代码中;而不是在您发布的代码中。还要确保您所有的网点和代表都正确连接。
更新:我已经编辑了上面的代码。注释掉的行是问题所在,您应该使用 reloadInputViews 来更新按钮。
看来它并没有锁定键盘;但是它所做的是在您键入第一个字母并执行 resign/become 调用以刷新按钮之后,然后第二次按下将覆盖第一个。这似乎是 iOS 中的一个错误......如果在第一个字母后键入一个空格,它会更明显。当我注意到我添加了一个标签,该标签使用密码字段的内容更新了它的内容,并且更清楚发生了什么。
关于objective-c - 在编辑时更改 returnButton 会卡住键盘 1 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512880/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的