将UITextView转换为UITextField

时间:2012-09-14 15:05:20

标签: ios5 casting uitextfield uitextview

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

我有一系列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 * _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,因为他们都继承了它?

提前谢谢

2 个答案:

答案 0 :(得分:0)

我认为你的想法存在一些问题。您需要进入两个级别才能达到常见的超级类型。 UITextField和UITextView都是“可见”组件,因此它们继承自UIView。他们都可以被投射到UIView而不是彼此。但这对你的问题没有帮助。我想你也可能在代表团中苦苦挣扎。

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

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

最后,对象不能被投射到他们不是的东西上。它们只能作为自己的类型或任何祖先进行演绎。

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

希望这有帮助。

答案 1 :(得分:0)

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

您无需转换为其他类型或任何内容。