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 にキャストする必要がありますか?

前もって感謝します

4

2 に答える 2

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 に答える
0

私はあなたがあなたの思考にいくつかの問題を抱えていると思います。一般的なスーパータイプに到達するには、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)を設定する必要があります。

お役に立てれば。

于 2012-09-14T20:46:36.817 に答える