0

スクロールビュー内にフィールドエディタ(NSTextField用)を埋め込んだ経験がある人はいますか?編集中にNSTextFieldをスクロール可能にしようとしています。

私が試したこと:

  1. -becomeFirstResponderカスタムフィールドエディタが呼び出されたときに動的に埋め込みます。この半作品; 問題は、編集中にNSTextFieldのサイズが変更されると、カスタムフィールドエディターのサイズが変更されなくなることです(これが必要です-アコーディオンスタイルのアプリケーションを作成します)

  2. NSScrollViewから「マスカレード」フィールドエディタを作成し、NSInvocationを使用して、メソッドを実際の代理フィールドエディタに転送します。これは私が本当にうまくいくことを望んでいる方法です。ここにリストされているすべてのメソッドを実装しました; しかしEXC_BAD_ACCESS、フィールドエディタが実際にロードされるたびに(たとえば、を呼び出すと[customTextField selectText:nil])取得します。ゾンビが有効になっている場合でも、デバッガーから情報を取得できないようです。ログを確認してNSObjCMessageLoggingEnabledも何も得られません。これらの人はそれを機能させたようですが、それは7年前のことです。

最後の手段は、NSTextFieldsを完全に削除してNSTextViewsを使用することです(または、フィールドエディターメカニズムに依存する代わりに、自分で作成します)が、一度に1つしか編集されないデータの行が多数あるため、それらのすべてに対してNSTextViewをインスタンス化する必要があります...しかし、おそらくそれはそれほど悪くはないでしょう。

4

1 に答える 1

0

最終的にオプション 1 を使用し、問題なく動作するようになりました。EXC_BAD_ACCESSオプション 2 は、どこに行ってもポップアップしたため、完全に行き止まりでした。

カスタム フィールド エディターは、(カスタム) スクロール ビューへの参照を保持して (vvScrollView) に埋め込み、それをビュー階層に挿入します。スクロール ビュー内に埋め込むためのカスタム フィールド エディター (NSTextView) 内のコード。フィールド エディターがファーストレスポンダーになるとすぐに呼び出され、ビュー階層に自動的に挿入されます。

- (void)embedSelfInScrollView {
    NSView *realSuperview = [[self superview] superview];
    // [self superview] is some kind of private NSClipView class
    if ([realSuperview isKindOfClass:[NSTextField class]]) { // the expected behavior: this may change? TODO make less prone to chance
        [realSuperview addSubview:[self vvScrollView]]; // insert into view
        [[self vvScrollView] setFrameSize:[realSuperview frame].size]; // se the initial size equivalent to control size so it can autoresize the same way
        // add the scrollview into the view hierarchy
        [[self vvScrollView] setDocumentView:self]; // removes self from previous superview
    }
}

私が抱えていた最初の問題は、スクロールビューをフィールドエディター (NSClipView のプライベートクラス) のすぐ上のスーパービューに挿入しようとしていたことでした。これにより、ほとんどすべての自動サイズ変更オプションが壊れました (編集中に NSTextField のサイズを変更できるようにしたいため)。 . さらに一歩進んで、プライベート クラスをバイパスすることは機能しているように見えますが、ほとんど恣意的なようです。

于 2012-04-15T05:20:26.227 に答える