1

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

我有一系列 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,因为它们都继承自 UIView 吗?

先感谢您

4

2 回答 2

0

我认为你的想法有一些问题。您将需要下降两个级别才能获得一个常见的超级类型。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)才能使其正常工作。

希望这可以帮助。

于 2012-09-14T20:46:36.817 回答
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];}
}

您不需要转换为不同的类型或任何东西。

于 2012-09-15T02:28:02.673 回答