【问题标题】:cast UITextView to UITextField将 UITextView 转换为 UITextField
【发布时间】:2026-01-13 03:20:08
【问题描述】:

这似乎是一个非常简单的问题,但是我还没有找到一个简单的选项......

我有一系列 UITextField 和 UITextView。如何在下面的相同方法中合并 TextFields 和 TextView。

-(BOOL) textFieldDidBeginEditing:(UITextField *) textField{
textField = activeField;
if([self.textField1 isFirstResponder]){activeField = textField1;}
else if([self.textField2 isFirstResponder]){activeField = textField2;}
else if([self.textField3 isFirstResponder]){activeField = textField3;}
else if([self.textView1 isFirstResponder]){ activeField = textView1;}

[scrollView1 scrollRectToVisible:[activeField frame] animated:YES];

return NO;
}

最后一行导致警告:

不兼容的指针类型从 'UITextView *_strong' 分配给 'UITextField *_strong'

这是由于(我确定)UITextField 和 UITextView 是不同的对象这一明显事实......这很好但是有办法解决这个问题,因为我希望能够通过带有下一个和上一个按钮的 textFields 和 TextViews。

按照这个方法

-(void) nextTextField:(id)sender{
if([self.textField1 isFirstResponder]){activeField = textField2;}
else if([self.textField2 isFirstResponder]){activeField = textField3;}
else if([self.textField3 isFirstResponder]){activeField = textView1;}
else if([self.textView1 isFirstResponder]){ activeField = textField1;}
}

我希望有一个铸造类型的选项,但是我对如何在目标 C 中铸造有点困惑......但这听起来可能很愚蠢

activeField = ((UITextField) textView1);

这就是我在 Java 中的投射方式,但似乎我似乎无法正确地理解他的语法。
我应该转换为 UIView,因为它们都继承自 UIView?

提前谢谢你

【问题讨论】:

    标签: ios5 casting uitextfield uitextview


    【解决方案1】:

    好的,所以你不需要为这个方法存储 activeField,所以唯一相关的代码就是你的 nextTextField: 方法。尝试将其更改为:

    -(void) nextTextField:(id)sender{
              if([self.textField1 isFirstResponder]) {[textField2 becomeFirstResponder];}
         else if([self.textField2 isFirstResponder]) {[textField3 becomeFirstResponder];}
         else if([self.textField3 isFirstResponder]) {[textView1  becomeFirstResponder];}
         else if([self.textView1 isFirstResponder])  {[textField1 becomeFirstResponder];}
    }
    

    您不需要强制转换为其他类型或任何东西。

    【讨论】:

    • 干杯...这很有帮助。成为第一响应者工作得很好,但是 textField(s)/view(s) 上的 scrollToRect 现在正在抱怨。我已经勾选了你的答案,因为它确实解决了问题并且你的建议有效。
    • 谢谢,现在您已获得 10 分,您可以通过单击复选标记上方的向上箭头“投票”您认为有帮助的答案。您可以对所有个有帮助的答案执行此操作,而不仅仅是勾选正确答案的那个。这将为帮助您回答问题的人提供积分!至于您的滚动问题,如果您还没有解决,请随时发布另一个问题,我相信我们将能够提供帮助。
    【解决方案2】:

    我认为你的想法有一些问题。您将需要下降两个级别才能获得一个常见的超级类型。 UITextField 和 UITextView 都是“可见”组件,因此它们继承自 UIView。它们都可以转换为 UIView 但不能互相转换。但这对您的问题没有帮助。我认为您可能也在为授权而苦苦挣扎。

    方法 textFieldDidBeginEditing: 是一个委托调用,它只适用于 UITextField。这就是为什么包含上述方法的类应该实现 UITextFieldDelegate。当您将焦点设置到 UITextField 时,UITextField 首先检查委托是否为 nil。如果委托属性包含一个类,则 UITextField 检查它是否显式地实现了 textFieldDidBeginEditing: 方法。如果方法在委托中实现,则 UITextField 调用该方法。

    这与 UITextView 没有什么不同。但是 UITextView 甚至不知道 textFieldDidBeginEditing: 方法。它有自己的委托和自己的方法,执行与 textFieldDidBeginEditing: 相同的一般功能。此方法的 UITextView 版本称为 textViewDidBeginEditing:。与 UITextfield 一样,UITextView 检查委托不是 nil 并且它实现了 textViewDidBeginEditing:。如果满足这些要求,那么 UITextView 将 textViewDidBeginEditing。但是 UITextView 永远不会调用 textFieldDidBeginEditing:.

    最后,对象不能被转换成它们不是的东西。它们只能被转换为它自己的类型或它的任何祖先。

    您需要设置每个组件的方法(textFieldDidBeginEditing 和 textViewDidBeginEditing)才能正常工作。

    希望这会有所帮助。

    【讨论】: