草庐IT

ios - UITextField 的奇怪行为和辞职的第一响应者

coder 2024-01-24 原文

在我的 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 被取消,就会发生以下情况:

  1. textFieldDidEndEditing 被调用(预期且文本参数为 nil )- 很好。

  2. textFieldDidBeginEditing 被调用 -(预期我们又回到了现在再次成为第一响应者的 textField)

  3. textFieldDidEndEditing 在刚刚成为第一响应者的文本字段上再次调用。由于旧的失败文本仍在该字段中,因此验证失败并且我们进入了一个持续循环。

为什么 textFieldDidEndEditing 被调用了两次?

编辑:

UIAlertView 被关闭后来自引用的堆栈跟踪:

最佳答案

因为我无法弄清楚为什么 textFieldDidEndEditing 被调用两次,所以我决定查看其他可能更合适的 UITextField delegate 方法并找到了这个 gem:textFieldShouldEndEditing - 它询问 textField 应该 结束编辑。似乎是我的验证逻辑进入的完美位置。如果验证失败,我只是返回 NO,并且焦点仍然在 UITextField 上,因此,不需要 UIAlertView 的 delegate 方法:clickedButtonAtIndex - 代码更少!

解决方法 似乎是解决我的问题的正确方法。

关于ios - UITextField 的奇怪行为和辞职的第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560161/

有关ios - UITextField 的奇怪行为和辞职的第一响应者的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个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

  7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  8. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  9. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在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

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    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上

随机推荐