10

デリゲート メソッドを UITextView で動作させようとしていますが、何らかの理由で動作しません。

私はviewController.hでそれがUITextViewDelegateであることを宣言しました

textView をタップすると、次のコードを使用してデフォルト コード「TEXT」を消去しようとしています。

- (void)textViewDidBeginEditing:(UITextView *)textView {

    if (myTextView.text == @"TEXT") {
        [myTextView setText:@""];
    }

    NSLog(@"did begin editing");
}

textView をタップしてキーボードが表示されると、テキストがクリアされ、NSLog が表示されることを期待していました。何も起こりません


ところで、コンテンツのサイズに基づいてビューをスケーリングする必要があり、textView には contentSize プロパティがあり、label と textField にはないように見えるため、テキスト ビューを使用します。

アップデート:

私は使用する必要がありました:

if ([myTextView.text isEqualToString:@"TEXT"]) {
    [myTextView setText:@""]; }

ご覧になりたい場合は、こちらのプロジェクトをご覧ください。

4

6 に答える 6

8

このメソッドは、Test2ViewController.mファイルにありません。

- (void)viewDidLoad {
    [myTextView setDelegate:self];
}

または、必要に応じて、 Interface Builderでデリゲートを接続することもできます。

更新#1:

キーを制御するために、このメソッドをクラスに追加しreturnます。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]) {
        NSLog(@"Return pressed, do whatever you like here");
        return NO; // or true, whetever you's like
    }

    return YES;
}
于 2012-08-06T08:52:52.943 に答える
2

Interface Builder で TextView のデリゲートを親クラスに接続します。コード化するよりも IB で接続を使用するのが好きです。私にとっては、見るべきコードが少ないほど良いです:)。また、文字列をそのように比較しないでください。文字列比較には isEqualToString を使用します。

if ([myTextView.text isEqualToString:@"TEXT"]) {
        [myTextView setText:@""];
}

接続写真

固定プロジェクトは次のとおりです

于 2012-08-06T08:50:18.957 に答える
2

原則として良い解決策があると思います:

UITextView のデリゲートを自分自身に設定してから、同じ名前を再利用して独自のデリゲートを作成します。これにより、外見と何も変わらずにデリゲートをインターセプトできます。

@interface TTGTextView : UITextView<UITextViewDelegate>// UIPlaceHolderTextView
@property(nonatomic, assign) id<UITextViewDelegate> delegate;
@synthesize delegate = realDelegate;

次に、メソッドをインターセプトします。それらすべてをカバーする必要があることに注意してください。そうしないと、「実際の」デリゲートに反応しません。

-(void)textViewDidBeginEditing:(UITextView *)textView
{
  if ([realDelegate respondsToSelector:@selector(textViewDidBeginEditing:)])
    [realDelegate textViewDidBeginEditing:textView];
  /*YOUR CODE HERE*/
}
-(void)textViewDidChange:(UITextView *)textView
{
  if ([realDelegate respondsToSelector:@selector(textViewDidChange:)])
    [realDelegate textViewDidChange:textView];
  /*YOUR CODE HERE*/
}
-(void)textViewDidChangeSelection:(UITextView *)textView
{
  if ([realDelegate respondsToSelector:@selector(textViewDidChangeSelection:)])
    [realDelegate textViewDidChangeSelection:textView];
  /*YOUR CODE HERE*/
}
-(void)textViewDidEndEditing:(UITextView *)textView
{
  if ([realDelegate respondsToSelector:@selector(textViewDidEndEditing:)])
    [realDelegate textViewDidEndEditing:textView];
  /*YOUR CODE HERE*/
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
  if ([realDelegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)])
    return [realDelegate textView:self shouldChangeTextInRange:range replacementText:text];
  return YES;
}
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
{
  if ([realDelegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)])
    return [realDelegate textView:self shouldInteractWithURL:URL inRange:characterRange];
  return YES;
}
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)range
{
  if ([realDelegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)])
    return [realDelegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:range];
  return YES;
}

一部のメソッドは正しく起動しますが、他のメソッドはまったく起動しませんが、「実際の」デリゲートにはすぐに表示されます。しかし、これは出発点です。より堅実で一般的な方法は、ある種のマルチプレクサを作成することだと思います-発火するデリゲートの配列を保持する UITableViewDelegate にします。

于 2014-08-14T22:54:55.030 に答える
1

あなたの見解に依存します。TextField を使用する場合は、以下に示すように、.header ファイルで UITextFieldDelegate をデリゲートとして使用する必要があります。

@interface ExamPageViewController : UIViewController <UITextFieldDelegate>

UITextFieldDelegate メソッドを使用できます。わかります。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.questionAnswerTextField resignFirstResponder];
    return YES;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField {

    if ([textField.text isEqualToString:@"Sorunun cevabını buraya yazınız!"]) {
        textField.text = @"";
    }
}


- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ([textField.text isEqualToString:@""]) {
        textField.text = @"Sorunun cevabını buraya yazınız!";
    }
}

それ以外の場合は、以下のコード スニペットのように UITextViewDelegate をデリゲートとして使用する必要があります。

@interface ExamPageViewController : UIViewController <UITextViewDelegate>

そして、これらのデリゲート メソッドを .m ファイルで使用することができます

- (BOOL)textViewShouldReturn:(UITextView *)textField {
    [self.questionAnswerTextField resignFirstResponder];
    return YES;
}

-(void)textViewDidBeginEditing:(UITextView *)textField {

    if ([textField.text isEqualToString:@"Sorunun cevabını buraya yazınız!"]) {
        textField.text = @"";
    }
}


- (void)textViewDidEndEditing:(UITextView *)textField {
    if ([textField.text isEqualToString:@""]) {
        textField.text = @"Sorunun cevabını buraya yazınız!";
    }
}
于 2016-10-28T08:14:41.840 に答える
1

あなたの UITextview は、そのデリゲート メソッドがどこにあるかを伝える必要があります...

インターフェイスビルダーを介して追加する場合は、デリゲートを接続するだけです

またはコード経由の場合

[yourTextViewOutlet setDelegate:self];
于 2012-08-06T08:57:05.333 に答える
0

スイフト 4,5

この拡張機能をコントローラーの下部に記述します。textView でプレースホルダーを表示および非表示にするために使用できます。

extension ViewController: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView == yourTxtView {
            txtNote.text = ""
            txtNote.textColor = .black
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        if textView == yourTxtView {
            txtNote.text = "Note:"
            txtNote.textColor = .gray
        }
    }
}
于 2020-01-07T10:43:22.313 に答える