NSTableViewで使用するためにNSCellをサブクラス化しようとしています。作成したいセルはかなり複雑なので、Interface Builderで設計してから、ペン先からNSCellをロードできると非常に便利です。
これは可能ですか?どうすればいいのですか?
NSTableViewで使用するためにNSCellをサブクラス化しようとしています。作成したいセルはかなり複雑なので、Interface Builderで設計してから、ペン先からNSCellをロードできると非常に便利です。
これは可能ですか?どうすればいいのですか?
このスレッドのいくつかの回答は、元の質問が Cocoa に関するものであったときに、Cocoa Touch について話しているため、トピックから外れています。2 つの API はこの点でまったく異なり、UITableViewCell はビューのサブクラスであるため、Cocoa Touch を使用すると簡単になります。NSCellはそうではなく、それが問題です
情報については、最近 NSOutlineView で非常に似たようなことをしなければなりませんでした。これは基本的に同じですが、レベルの開示/崩壊に対処する必要があるため、どちらかといえば少し難しいです。コードに興味がある場合は、ここに投稿しました: http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib /
HTH
質問は NSCell のサブクラスに関するものでした。他の答えは、おそらくビューである UITableViewCell を利用して、何か他のことをしているようです。
NSCell はビューではありません。IB でカスタム セルを配置することは便利なことですが、答えは基本的に「いいえ、これは不可能です」と思います。NSCell をサブクラス化すると、自分で描画するだけです。サブセル、またはパラメータ化された自動レイアウト (ala NSView のスプリングとストラット) はサポートされていません。これは、あなたが探しているものと思われます。
唯一の注意点は、サブ要素のレイアウトを行い、それらのサブ要素とすべての調整可能なパラメーターを設定するためのパラメーターを提供する NSCell サブクラスを設計できることです。次に、IB プラグインを作成して、そのセルと付随するインスペクターを IB で設計時に使用できるようにする必要があります。
ただし、これは、ほぼ同じことを行う小さなカスタム アプリを作成するよりもおそらく難しいでしょう。ウィンドウの中央にあるコントロールに NSCell を配置し、関心のあるパラメーターを微調整するための UI を作成します。バインディングを使用すると、配置を非常に簡単にすることができます (つまり、x 値をスライダーにバインドします)。もちろん、要素を直接操作することはできません。完了したら、セルをアーカイブして実際のアプリで実行時にアーカイブをロードするか、プロパティをログアウトしてアプリのコードで設定することができます。
ケンが言うように、NSCells
とは異なり、 NIB でNSViews
のみ階層をレイアウトできます(明示的な階層はありません)。NSView
NSCells
一方、階層を持ち、NSViews
それを使用して描画することを妨げるものは何もありませんNSCell
-セルの親ビューのサブビューとしてそれらを追加し、表示するように指示し、ウィンドウからそれらを削除しても、誰も賢い。
この場合、NIB を使用するとうまくいきますが、面倒なように思えます。通常、私は to のオブジェクトをNSCells
my のカスタムオブジェクトに置き換えただけNSViews
ですが、それは独自のマウス処理コードを作成することを意味し、これは非常に扱いにくいものです。
一方、私のアプローチでは、NIB でビューの値をバインドできるため、余分な作業を行う必要はありません。これはすばらしいことです。
IB で、空の XIB を開始します。パレットに移動して UITableViewCell をドラッグし、ダブルクリックして表示して編集します。
カスタムUITableViewCellのみを含めます(他のUIViewやその他のトップレベルコントロールは含めません)-IBで実際のUITableViewCellであることを確認してください。そうしないと、再利用識別子を設定できません(IBでUIViewをカスタムUITableViewCellクラスとしてキャストするのではなく)。次に、セル内にラベルや好きなものを追加したり、再利用識別子を設定したり、好きな開示インジケーターを設定したりできます。
使用するには、次のようなコードを tableView:cellForRow:atIndexPath: メソッドに提供します。
YourCustomCellClass *cell = (YourCustomCellClass *)[tableView dequeueReusableCellWithIdentifier:<IDYouSetInXIBFile>];
if ( cell == nil )
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:<YourXIBName> owner:self options:nil];
id firstObject = [topLevelObjects objectAtIndex:0];
if ( [ firstObject isKindOfClass:[UITableViewCell class]] )
cell = firstObject;
else cell = [topLevelObjects objectAtIndex:1];
}
コードで参照したいラベルやその他のコントロールがある場合は、IB でそれらをカスタム セル クラスに接続します。ファイルの所有者ではなく、上記のコードを使用して設定する必要はありません (NSObject のままにしておくことができます)。 )。
編集:NSCellの回答を本当に探していることに注意してください。しかし、IBを使用するためのコードアプローチは、Cocoaで上記で使用したCocoa Touchコードと同じである必要があります.loadNibNamedは標準のCocoa呼び出しです.
Joar Wingfors は、数年前にStepwiseの関連トピックであるSubviews in TableView Rowsに関する記事を書きました。
主な手法は、NSView をホストできる NSCell を作成することです。これを行う場合、Interface Builder で NSView サブクラスを設計し、その特定のセルが必要な場所ならどこにでも埋め込むことができます。
もう 1 つの可能性は、Leopard をターゲットにできる場合、NSTableView を使用する必要があるかどうか、または NSCollectionView を使用できるかどうかを確認することです。コレクション ビューは、セルではなく「アイテム ビュー」の観点から直接処理するため、Interface Builder での設計がより簡単になります。
しかし、完全には理解できない興味深い例をいくつか見つけました。
NSTextFieldCell
を参照してPBIconAndTextCellの を拡張しています。最後の 2 つの例は、 と で機能しNSTableViewDataSource
ますNSTableViewDelegate
。で を使用Bindings
しArrayController
て、InterfaceBuilder
テキスト フィールドなどの他の UI 要素を接続したいと考えています。
私は、Abizernが非常に有望に見えるAlex RozanskiによるPXListViewを指摘している別の議論に出くわしました!
私は自分で問題の解決策を実装しようとしています。githubで私のプロジェクトを見つけてください。最新のレンダリングの問題は、こちら で確認できます。
私はこのようにします:
/* example of a silly way to load a UITableViewCell from a standalone nib */
+ (CEntryTableViewCell *)cell
{
// TODO -- this is really silly.
NSArray *theObjects = [[NSBundle mainBundle] loadNibNamed:@"EntryTableViewCell" owner:self options:NULL];
for (id theObject in theObjects)
if ([theObject isKindOfClass:self])
return(theObject);
NSAssert(NO, @"Could not find object of class CEntryTableViewCell in nib");
return(NULL);
}
ただし、これはあまり効率的ではなく、大量のデータをロードしている場合は、問題が発生する可能性があります。もちろん、reuseIdentifierを使用する必要があります。これにより、このコードはテーブルごとに数回だけ実行されます。
1) 作成するNSViewController
TableViewCell.h
2)次TableViewCell.h
のようないくつかの手順で作成します
-(void)setText:(NSString *)text image:(NSImage *)image
3) メインクラスで#import "TableViewCell.h"
4) メインクラスで -(NSView *)tableView:viewForTableColumn:row: write:
NSImage *img = //some image
TableViewCell *cell = [[TableViewCell alloc] initWithWindowNibName:@"TableViewCell"];
cell.view.init;
[cell setText:@"some text" image:img];
return cell;
これが役立つことを願っています=)
ここでは、より現代的なアプローチを提供したいと思います。
iOS 5 以降、UITableView にはメソッドがあります。
(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
セルを含むNIBを登録したら、使用するだけです
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier
新しいセルを取得します。セルが再利用できる場合は、それが返されます。それ以外の場合は、新しいセルが自動的に作成されます。その場合、これは NIB ファイルからロードされることを意味します。
UITableViewCell
yourを your に追加し、プロパティtableviewcontroller
を宣言します。IBOutlet
@interface KuguTableViewController : UITableViewController {
IBOutlet UITableViewCell *customTypeCell;
}
@property (readonly) UITableViewCell *customTypeCell;
...次に、cellForRowAtIndexPath
セルを使用して再利用するように設定できます。
static NSString *CellIdentifier = @"CustomCell"
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = customTypeCell;
cell.reuseIdentifier = CellIdentifier;