在我的 iOS 应用程序中,我有一个表单供用户填写。我正在使用 UIKeyboard 上的返回键移动到屏幕上的下一个 UITextField。
所以我这样实现了textFieldShouldReturn:
-(BOOL)textFieldShouldReturn:(BBTextField *)textField
{
//The textFields are in a UITableView with custom cells///
NSIndexPath *indexPath = [self.tableView indexPathForCellContaininView:textField];
if (self.selectedSegmentIndex == SegmentedControlStep1){
if (indexPath.section == 0){
switch (indexPath.row){
case 0:
[self.textFieldne becomeFirstResponder];
break;
case 1:
[self.textFieldTwo becomeFirstResponder];
break;
}
}
if (indexPath.section == 1){
switch (indexPath.row){
case 0:
[self.textFieldThree becomeFirstResponder];
break;
case 1:
[self.textFieldFour becomeFirstResponder];
break;
case 2:
[self.textFieldFive becomeFirstResponder];
break;
}
}
if (indexPath.section == 2){
switch (indexPath.row){
case 0:
[self.textFieldSix becomeFirstResponder];
break;
case 1:
[self.textFieldSeven becomeFirstResponder];
break;
case 2:
[self nextButtonPressed:nil];
break;
}
}
}
if (self.selectedSegmentIndex == SegmentedControlStep2){
switch (indexPath.row){
case 0:
[self.textFieldNine becomeFirstResponder];
break;
}
}
return YES;
}
此代码有效。但是,当调用 textFieldDidEndEditing 时,我会验证一些文本字段的输入,如果验证失败,则会在屏幕上显示 UIAlert。
我是这样处理的:
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
/* Cancel registration */
if (buttonIndex == 1){
[self dismissViewControllerAnimated:YES completion:nil];
}
/* Okay button */
if (buttonIndex == 0){
if (self.viewModel.telephoneNumberFailedValidation){
[self.textFieldOne becomeFirstResponder];
}else if (self.viewModel.mobileNumberFailedValidation){
[self.textFieldTwo becomeFirstResponder];
}
}
}
因此,到目前为止,似乎一切正常。一旦 UIAlertView 被取消,就会发生以下情况:
textFieldDidEndEditing 被调用(预期且文本参数为 nil )- 很好。
textFieldDidBeginEditing 被调用 -(预期我们又回到了现在再次成为第一响应者的 textField)
textFieldDidEndEditing 在刚刚成为第一响应者的文本字段上再次调用。由于旧的失败文本仍在该字段中,因此验证失败并且我们进入了一个持续循环。
为什么 textFieldDidEndEditing 被调用了两次?
编辑:
在 UIAlertView 被关闭后来自引用的堆栈跟踪:
最佳答案
因为我无法弄清楚为什么 textFieldDidEndEditing 被调用两次,所以我决定查看其他可能更合适的 UITextField delegate 方法并找到了这个 gem:textFieldShouldEndEditing - 它询问 textField 应该 结束编辑。似乎是我的验证逻辑进入的完美位置。如果验证失败,我只是返回 NO,并且焦点仍然在 UITextField 上,因此,不需要 UIAlertView 的 delegate 方法:clickedButtonAtIndex - 代码更少!
此解决方法 似乎是解决我的问题的正确方法。
关于ios - UITextField 的奇怪行为和辞职的第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560161/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上