問題タブ [uitextviewdelegate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - テキストの削除/挿入後にUITextViewが上にスクロールする
iOS 7 用にアプリを書き直しています。現在、新しい TextKit API を使用しています。ほぼ完了しましたが、移行を開始して以来、頭痛の種となっている問題がもう 1 つあります。
問題: UITextView にテキストを入力すると、ビューがスクロールアップしてカーソルが非表示になることがあります。パターンを特定するのは難しいですが、行を削除した後に発生するようで、下のテキストを上に移動する必要があります. ただし、行を削除するのは2回目で、ドキュメント内の特定の行のみです(通常、改行文字のみを含む行ですが、常にではありません...)
私はstackoverflowでこれらのソリューションを使用してみました:
入力時にUITextViewが上にスクロールしないようにする方法
新しい行が挿入されるたびに UITextView がスクロールし続けるため、行が見えない (iPhone OS)
iOS 7 で不安定な UITextView の一番下までスクロールする
UITextView 内に UITableView がある場合、スクロールが正しく機能しないという他の多くの問題もあります。ビューにテーブル ビューがありません。
UITextView をサブクラス化し、ビューを上にスクロールするだけでなく、iOS 7 が呼び出しを行っていることを発見したことを指摘したいと思います。また、さらに奇妙なのは、(UITextView から文字を削除するために) 戻るボタンを押すと、2 つのメッセージが に送信されることtextViewDidChangeSelection:
です。問題が発生したときのコール スタックを次に示します。(問題が発生しない場合でも、デリゲートへの2つの呼び出しが発生しますtextViewDidChangeSelection:
...これは正常なようです):
- UITextView デリゲート
textViewDidChangeSelection:
には、長さ 1 で削除する文字の位置が含まれます。(つまり、1050,1) - UITextView デリゲート
textViewDidChangeSelection:
が再度呼び出され、同じ位置が含まれますが、長さはゼロです。(つまり、1050,0) - scrollViewDidScroll (最大 3 回。ただし、通常は 1 回のみ)
- 次に、iOS 7 が
UITextView.scrollRangeToVisible:
最初の呼び出しの範囲 {1050,1} で呼び出します。これは私には意味がありません。_ensureselectionvisible
この内部 API は、スクロール イベントを呼び出すために使用した可能性のある関数へのトレースバックなしで呼び出されるため、これは内部的に呼び出されており、コードからではありません。
おそらく、最初の 2 つの呼び出しは単に文字を選択するためのものであり、その後、内部的に deleteBackwards を呼び出します。それは理にかなっている。その後、私は盲目的に飛んでいます。なぜスクロールするのか、なぜscrollRangeToVisible:
間違った範囲で呼び出すのかわかりません。
ユーザーがテキストを編集しているときにUITextView.scrollRangeToVisible:
呼び出しなしで返すことでオーバーライドすることで、問題をある程度軽減することができました。[super scrollRangeToVisible]
これを行うには、スクロールビュー デリゲート呼び出しの一部をオーバーライドし、スクロールが発生しないことを示すフラグを設定します。これは、私にとっては非常に醜いハックであり、特定の状況で問題が発生します。たとえば、最初の編集時にビューをタップしたときや、スクロール ビューの減速が停止したときなどです。
要するに、スクロール イベントが発生し (おそらく前の行が上に移動したため)、何らかの理由で iOS がカーソルがビュー内にないと判断したということです。さらに興味深いのは、間違った範囲が指定されていても、正しい位置が指定されているため、ビュー内の間違った位置にスクロールされることです。さらに興味深いのは、特定の条件でのみ発生し、その条件が発生した 2 番目のインスタンスでのみ発生することです。私が考えることができる唯一のことは、テキストが削除された後に UITextView の高さが正しく計算されず、テキストが実際とは異なる場所にあると信じていることです。
前もって感謝します!
アップデート:
先ほど話したフラグを設定しましたが、scrollViewDidScroll:
他のいくつかのインスタンスでのジャンプを妨げません。ただし、テキストを逆方向に削除しても画面がジャンプする場合があります。ビューがまだジャンプするインスタンスでさらに奇妙なのは、[super scrollRangeToVisible]
呼び出されないようにしていることです。そのため、これに加えて内部で何かが起こっており、ビューがスクロールされています。
アップデート:
613pts から 670pts の間で上方にジャンプしているように見えます。点数差の原因がわかりません。ジャンプする行数も異なります。条件間で何かが似ている必要があると思います。また、 が呼び出されたときに、この呼び出しとデリゲート呼び出しの間で が同じでscrollViewDidScroll:
あることを確認しました。textView.selectedRange.location
textViewDidChangeSelection:
ios - 「テキストビューにテキストがある場合」の設定方法
ユーザーがUIButton
viewControllerに入ると灰色になります。もありUITextView
ます。ユーザーが にテキストを入力するとUITextView
、ボタンは赤くなりますが、テキスト ビューが空白の場合、ボタンは灰色になります。ユーザーがテキストを入力すると色が赤に変わりますが、ユーザーがテキストを削除すると、灰色に戻る代わりに赤のままになります。私が使用しているコードは次のとおりです。
ios - 既に表示されているときにリターンキーの種類を変更すると、UITExtview のキーボードを再描画する方法
UitTextview では、ユーザーが入力しているときにキーボードのリターン キーが改行キーのように動作するようにし、同じキーが数秒間非アクティブになった後に完了キーに変わり、改行を挿入する代わりにタッチするとキーボードを閉じるようにしたい
textview デリゲートを変更して、改行対却下のキーボード メカニズムを実行し、キーボードのリターン キーを UIReturnKeyDefault から UIReturnKeyDone に切り替え、改行対却下のメカニズムがうまく機能するようにしました。私が持っている唯一の問題は、リターンキーのタイプを self.TextView.returnKeyType = UIReturnKeyDone; に変更したときです。キーボードが更新/再描画されず、完了キーが表示されません。UITextView とメイン ビューで setNeedsDisplay を実行しようとしましたが、何も起こりません。キーボードのリターン キーは変わりません。キーボードが閉じられ、ユーザーがテキストビューを再入力したときに再び表示されると、完了キーがここにあります。
キーボードがアクティブで表示されている間に完了キーを再描画するにはどうすればよいですか?
私が使用した uitextview デリゲートは次のとおりです。
私はいたるところを見ましたが、キーボードが表示されているときにキーボードのキーを更新する方法に関する情報を見つけることができませんでした. 何か案は ?ご協力いただきありがとうございます
ios - textView rejectFirstResponder が UIKeyboardWillHideNotification を起動しない
UITexView
ボタンを含む UIView があります。デリゲートがいUITextViewDelegate
ます。
最初に UITextView にカーソルを設定すると、デリゲート関数が呼び出され、この関数が通知"textViewShouldEndEditing"
をトリガーします。UIKeyboardWillShowNotification
ここまでは順調ですね。
ボタンをクリックすると、関数が呼び出され[self.textView resignFirstResponder];
、この関数がデリゲートを呼び出します"textViewShouldEndEditing"
が、通知UIKeyboardWillHideNotification
は呼び出されません。
通知のリスナーがあります
足りないものはありますか???
ios - UITextField は、resignFirstResponder と組み合わせると最大 1 つの数値ではありません
最大数が 1 かどうかを確認するコードは、そのコードのみを使用する場合に機能します。しかし、[becomFirstResponder] で次の UITextField への自動ジャンプを追加すると、機能しなくなりました。
どうもありがとう!
いつ
MyViewController.h
MyViewController.m