Ios5 将UITextView强制转换为UITextField

Ios5 将UITextView强制转换为UITextField,ios5,casting,uitextfield,uitextview,Ios5,Casting,Uitextfield,Uitextview,这似乎是一个非常简单的问题,但我还没有找到一个简单的选择 我有一系列的UITextFields,后跟一个UITextView。如何在下面相同的方法中合并TextFields和TextView -(BOOL) textFieldDidBeginEditing:(UITextField *) textField{ textField = activeField; if([self.textField1 isFirstResponder]){activeField = textField1;} els

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

我有一系列的UITextFields,后跟一个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*\u strong”分配给“UITextField*\u strong”的指针类型不兼容

这是因为我确信UITextField和UITextView是不同的对象这一明显事实。。。这很好,但是有一种方法可以解决这个问题,因为我希望能够通过“下一步”和“上一步”按钮在文本字段和文本视图中前进

按照这个方法

-(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


提前谢谢你

我想你的想法有些问题。你需要下两级才能得到一个普通的超级类型。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才能使其工作


希望这能有所帮助。

好的,所以对于这个方法,您不需要存储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];}
}

您无需选择其他类型或任何类型。

干杯。。。这很有帮助。“成为第一响应者”功能很好,但是文本字段/视图上的scrollToRect现在正在抱怨。我已经勾选了你的答案,因为它确实解决了问题,你的建议也起了作用。谢谢,现在你有了10分,你可以通过点击复选标记上方的向上箭头,向上投票你认为有帮助的答案。您可以对所有有用的答案执行此操作,而不仅仅是勾选正确答案的答案。这将给帮助你回答问题的人打分!至于你的滚动问题,如果你还没有解决,请随时发布另一个问题,我相信我们将能够提供帮助。