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]