問題タブ [nscell]
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.
objective-c - フィルター処理された NSTableView から選択したセルの値を一貫して取得するにはどうすればよいですか?
環境
NSArrayController によって管理される 2 列のセル ベースの NSTableView があります。
- 最初の列には、値が有効かどうかを示すチェックボックスが表示されます。
- 2 番目の列は要素の名前を表します。
ビューは NSSearchField にリンクされているため、検索文字列を列 2 の文字列と比較する述語に基づいてフィルター処理されます。
ビューは正しく表示され、検索文字列が変更されたときに意図したとおりにフィルタリングされます。
要件
ユーザーが最大 5 行を有効にできるようにする必要があります。これを達成するために、バッキング アレイの変更を監視し、有効なエントリの量を追跡しています。カウントが 5 を超えた場合は、アラートでユーザーに通知し、選択された行インデックスを取得してバッキング アレイでそのインデックスを無効にすることで、以前に有効にしたエントリの選択を解除します。[willChange.. ..didChange] KVO ブロックでこれを行います。
これは、ビューがソートされていない場合は意図したとおりに機能しますが、選択された行が配列内の適切なインデックスに対応していないため、明らかに問題が発生します。
したがって、次のコードを使用して、ビューがフィルター処理されている場合 (検索文字列が空でない場合) に、選択したセルの文字列値を取得します。次に、配列をトラバースし、文字列に一致するエントリを無効にします。
問題
選択された行は常に正確ですが、代表セルから値を取得することは正確ではありません。最初は返された値が正しいように見えますが、他の行を選択すると、選択したインデックスがまだ正しい場合でも、次の行からデータが返されます。また、ビューのいくつかの行から値を返すことも確認しました。
アップデート
さらにテストした結果、初めてフィルターを適用すると機能するように見えますが、別の文字列によるフィルター処理では、その特定のフィルターで最初に選択されたセルのセル値が保持されます。
すなわち:
- ウィンドウを読み込んで6つのアイテムを選択
- 6 番目のアイテムの選択が解除され、ユーザーに警告されました
- フィルターを適用
- 新しい6番目のアイテムを選択してください
- 6 番目のアイテムの選択が解除され、ユーザーに警告されました
- 同じフィルターで別の 6 番目のアイテムを選択してください
- 6 番目のアイテムの選択が解除され、ユーザーに警告されました
- 新しいフィルタを入力してください
- 新しい6番目のアイテムを選択してください
- 6 番目のアイテムの選択が解除され、ユーザーに警告されました
- 同じフィルターから新しい 6 番目のアイテムを選択
- 選択したインデックスは正しいですが、選択した行の値は前の選択と同じです
- 正しいエントリが選択解除されていないため、ユーザーは繰り返し警告を受け、6 つのエントリが永続的に選択されました。
ただし、以前に選択されたアイテムではなく、次の行の値が返される場合もあります。
質問
私の質問は次のとおりです。
- フィルター処理されたリストに対して正しい方法で選択された行を取得していますか?
- リストがソートされている場合でも、選択した行に基づいて列 2 の文字列値を一貫して取得するにはどうすればよいですか?
お時間をいただきありがとうございます。
解決
セルを取得するコードを次のように変更して、これを解決しました。
に:
cocoa - NSSegmentedControl の高さを変更する方法
25px の「通常の」コントロール サイズを超えて、NSSegmentedControl の高さを増やそうとしています。NSSegmentedCell をサブクラス化しました。2 つのメソッドを使用できることを理解しています。
セグメント化されたコントロールを IB に配置すると、NSSegmentedCell サブクラスで上記のメソッドをオーバーライドします。例外として、渡されるフレームとビューは、IB のセグメント化されたコントロールの高さに基づいています。だから、ここからどこへ行けばいいのかわからない。
NSSegmentedControl もサブクラス化し、必要な高さで独自のコントロールを描画する必要がありますか? NSSegmentedCell サブクラスを使用してセグメントを処理しますか?
cocoa - NSCell KVOモニタリングのハイライト
ボタンセルのハイライト状態を監視したいのですが、ハイライトが変化してもコールバックが呼び出されません
keyPathの「状態」の監視は機能しますが、監視が強調表示されないのはなぜですか?
objective-c - NSCell vs NSView: 多くのコントロールが必要な場合
Apple がNSCell
を支持して の使用を推奨していないことは承知していますNSView
(AppKit 10.10 リリース ノートを参照)。以前はNSCell
、パフォーマンス上の理由から、多くのコントロールが必要な場合に使用することが推奨されていました。
多くのサブビューを必要とするカスタム コントロールの実装にかなりの時間を費やしましたが、NSView タイプのサブビューを使用したパフォーマンスは良くありませんでした。関連する stackoverflow の議論 を参照してください。ウィンドウ内に保持できる NSView タイプのインスタンスの数に関する実際的な制限は何ですか? 私は 1000 ~ 2000 個のメモリ内オブジェクトに苦労していました (これはあまり多くないようです)。この制限の実際の理由は何ですか?
上記で私を混乱させているのは、View ベースの Cocoa NSTableViews です。1000 ~ 2000 を超えるセルを含む tableView を作成できますが、読み込みとスクロールのパフォーマンスが低下しているようには見えませんか? 各セルが NSView である場合、これはどのように達成されますか?
実際的な制限がある場合、Apple は NSCell の使用を推奨しないと言ったときに何を考えているのでしょうか? 一部のコントロールには多数のサブビューが必要であることを彼らは認識していると確信しています。
さらに、(おそらく時代遅れの) Apple Developer Guide は、さらに説明する必要がある NSView と NSCell の違いについて次の説明を提供します。
「セルはコントロールよりも軽量であるため、継承されたデータと動作の点で、複数のコントロールよりも複数セルのコントロールを使用する方が効率的です。」
継承されたデータ: これは、データが使用されている場合にのみ「肥大化」を引き起こします => 必要な場合にのみ使用されますか?
継承された動作: クラス/オブジェクトで使用しないメソッドは、オーバーヘッドを引き起こすことはありませんか?
軽量の NSCell と重量の NSView の実際の違いは、慣習的に受け入れられているように見えること以外に何ですか? (私は本当に知りたいです。)
swift - Swift で NSTextField から NSImage を取得する
私は、次のように Obj-C から NSTextField のサブクラスで NSImage を取得していました。
Swift で同じことをしようとすると、キャストできないように見えますattachmentCell
が、コンパイラ エラーが発生します。
objective-c - NSTableView テキスト セル内でハイパーリンクを作成して応答する
アップロードするファイルが取り込まれた NSTableView を持つプログラムがあります。ファイルが送信されると、ファイルの名前を持つテキスト セルにハイパーリンクが配置されます (配列データには、NSLinkAttributeName 属性を持つ NSMutableString が与えられます)。ユーザーがこのリンクをクリックして、既定のブラウザーで Web ページを開くことを許可するにはどうすればよいですか?
objective-c - Swift 1.2 NSCell のサブクラスをサブクラス化できないのはなぜですか?
NSCell のサブクラスをサブクラス化できないのはなぜですか? をサブクラス化したいのですがMyButtonCell
、これはCustomButtonCell: NSButtonCell
です。意味
常に次のエラーが表示されます。
私の問題を再現する簡単な手順:
ターミナルを開く
タイプ:
swift
(最新の Xcode 6.3.1 を使用している場合)あなたが取得するとき、
Welcome to Swift version 1.2. Type :help for assistance.
次のように入力します。
- 次のエラーが表示されます。
declaration has a different @objc name from the declaration it overrides ('initTextCell:' vs. 'initWithTextCell:')__lldb_expr_9.Foo:3:24: note: overridden declaration is here @objc @objc override init(textCell aString: String) ^ declaration has a different @objc name from the declaration it overrides ('initImageCell:' vs. 'initWithImageCell:')__lldb_expr_9.Foo:4:24: note: overridden declaration is here @objc @objc override init(imageCell image: NSImage?) ^
なんで?この問題を回避する方法はありますか?
参考までに: Swift 1.1 にはこの問題はありませんでした。
macos - NSCell サブクラス化: NSProgressIndicator を描画しますか?
セルベースの NSTableView を使用しています。カスタムNSCell
サブクラスを作成して NSProgressIndicator を描画する方法はありますか?
次のようなもの:
それNSProgressIndicator
自体はステータス表示としてのみ機能し、ユーザーとの対話はありません(マウスのクリックなどは必要ありません)。
私は NSTableViewDataSource を使用しているので、セルベースの NSTableView に固執したいと思います。NSLevelIndicatorCell
代替手段ですが、私はの外観/デザインを好みますNSProgressIndicator