菜鸟教程小白 发表于 2022-12-13 09:07:53

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


                                            <p><p>在我的 iOS 应用程序中,我有一个用户填写的表单。我正在使用 <code>UIKeyboard</code> 上的返回键移动到屏幕上的下一个 <code>UITextField</code>。 </p>

<p>所以我像这样实现了 <code>textFieldShouldReturn</code>:</p>

<pre><code>-(BOOL)textFieldShouldReturn:(BBTextField *)textField
{
//The textFields are in a UITableView with custom cells///
    NSIndexPath *indexPath = ;

    if (self.selectedSegmentIndex == SegmentedControlStep1){

            if (indexPath.section == 0){
                  switch (indexPath.row){
                        case 0:
                            ;
                            break;
                        case 1:
                            ;
                            break;
                  }
            }


            if (indexPath.section == 1){
                  switch (indexPath.row){
                        case 0:
                            ;
                            break;
                        case 1:
                            ;
                            break;
                        case 2:
                            ;
                            break;
                  }
            }

            if (indexPath.section == 2){

                  switch (indexPath.row){
                        case 0:
                            ;
                            break;
                        case 1:
                            ;
                            break;
                        case 2:
                            ;
                            break;
                  }
             }
    }

    if (self.selectedSegmentIndex == SegmentedControlStep2){

      switch (indexPath.row){
            case 0:
                ;
                break;
      }
    }

    return YES;
}
</code></pre>

<p>此代码有效。但是,当调用 <code>textFieldDidEndEditing</code> 时,我会验证某些文本字段的输入,如果验证失败,则会在屏幕上显示 UIAlert。 </p>

<p>我是这样处理的:</p>

<pre><code>-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    /* Cancel registration */
    if (buttonIndex == 1){
            ;

    }
    /* Okay button */
    if (buttonIndex == 0){

            if (self.viewModel.telephoneNumberFailedValidation){

                        ;

            }else if (self.viewModel.mobileNumberFailedValidation){

                        ;
            }
    }
}
</code></pre>

<p>所以到目前为止,一切<em>似乎</em>都可以正常工作。一旦 <code>UIAlertView</code> 被解除,就会发生以下情况:</p>

<ol>
<li><p><code>textFieldDidEndEditing</code> 被调用(预期并且文本参数为 nil ) - 很好。 </p></li>
<li><p><code>textFieldDidBeginEditing</code> 被调用 - (预期我们现在又回到了第一个响应者的 textField 上)</p></li>
<li><p><code>textFieldDidEndEditing</code> 在刚刚成为第一响应者的文本字段上再次调用。由于旧的失败文本仍在该字段中,验证失败,我们进入一个恒定循环。 </p></li>
</ol>

<p>为什么 <code>textFieldDidEndEditing</code> 会被调用两次? </p>

<p>编辑:</p>

<p><code>UIAlertView</code> 被解除后来自引用的堆栈跟踪:</p>

<p> <a href="/image/wqSwz.png" rel="noreferrer noopener nofollow"><img src="/image/wqSwz.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>由于我无法弄清楚为什么 <code>textFieldDidEndEditing</code> 被调用了两次,我决定查看其他可能更合适的 <code>UITextField 委托(delegate)</code> 方法并找到了这个 gem:<code>textFieldShouldEndEditing</code> - 它询问 <code>textField</code> <em>应该</em> 是否结束编辑。似乎是我的验证逻辑进入的完美位置。如果验证失败,我只需返回 <code>NO</code> 并且焦点仍然在 <code>UITextField</code> 因此,不需要 <code> UIAlertView 的</code> <code>delegate</code> 方法:<code>clickedButtonAtIndex</code> - 更少的代码! </p>

<p>这个 <code>workaround</code> 似乎是解决我的问题的正确方法。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UITextField 的奇怪行为和辞职的第一响应者,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31560161/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31560161/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UITextField 的奇怪行为和辞职的第一响应者