22

NSTableViewで使用するためにNSCellをサブクラス化しようとしています。作成したいセルはかなり複雑なので、Interface Builderで設計してから、ペン先からNSCellをロードできると非常に便利です。

これは可能ですか?どうすればいいのですか?

4

10 に答える 10

11

このスレッドのいくつかの回答は、元の質問が 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

于 2010-08-08T11:28:25.127 に答える
11

質問は NSCell のサブクラスに関するものでした。他の答えは、おそらくビューである UITableViewCell を利用して、何か他のことをしているようです。

NSCell はビューではありません。IB でカスタム セルを配置することは便利なことですが、答えは基本的に「いいえ、これは不可能です」と思います。NSCell をサブクラス化すると、自分で描画するだけです。サブセル、またはパラメータ化された自動レイアウト (ala NSView のスプリングとストラット) はサポートされていません。これは、あなたが探しているものと思われます。

唯一の注意点は、サブ要素のレイアウトを行い、それらのサブ要素とすべての調整可能なパラメーターを設定するためのパラメーターを提供する NSCell サブクラスを設計できることです。次に、IB プラグインを作成して、そのセルと付随するインスペクターを IB で設計時に使用できるようにする必要があります。

ただし、これは、ほぼ同じことを行う小さなカスタム アプリを作成するよりもおそらく難しいでしょう。ウィンドウの中央にあるコントロールに NSCell を配置し、関心のあるパラメーターを微調整するための UI を作成します。バインディングを使用すると、配置を非常に簡単にすることができます (つまり、x 値をスライダーにバインドします)。もちろん、要素を直接操作することはできません。完了したら、セルをアーカイブして実際のアプリで実行時にアーカイブをロードするか、プロパティをログアウトしてアプリのコードで設定することができます。

于 2008-10-15T06:59:35.623 に答える
7

ケンが言うように、NSCellsとは異なり、 NIB でNSViewsのみ階層をレイアウトできます(明示的な階層はありません)。NSViewNSCells

一方、階層を持ち、NSViewsそれを使用して描画することを妨げるものは何もありませんNSCell-セルの親ビューのサブビューとしてそれらを追加し、表示するように指示し、ウィンドウからそれらを削除しても、誰も賢い。

この場合、NIB を使用するとうまくいきますが、面倒なように思えます。通常、私は to のオブジェクトをNSCellsmy のカスタムオブジェクトに置き換えただけNSViewsですが、それは独自のマウス処理コードを作成することを意味し、これは非常に扱いにくいものです。

一方、私のアプローチでは、NIB でビューの値をバインドできるため、余分な作業を行う必要はありません。これはすばらしいことです。

于 2008-10-25T23:06:33.570 に答える
5

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呼び出しです.

于 2008-10-15T04:56:19.817 に答える
2

Joar Wingfors は、数年前にStepwiseの関連トピックであるSubviews in TableView Rowsに関する記事を書きました。

主な手法は、NSView をホストできる NSCell を作成することです。これを行う場合、Interface Builder で NSView サブクラスを設計し、その特定のセルが必要な場所ならどこにでも埋め込むことができます。

もう 1 つの可能性は、Leopard をターゲットにできる場合、NSTableView を使用する必要があるかどうか、または NSCollectionView を使用できるかどうかを確認することです。コレクション ビューは、セルではなく「アイテム ビュー」の観点から直接処理するため、Interface Builder での設計がより簡単になります。

于 2008-10-17T00:05:40.730 に答える
1

しかし、完全には理解できない興味深い例をいくつか見つけました。

最後の 2 つの例は、 と で機能しNSTableViewDataSourceますNSTableViewDelegate。で を使用BindingsArrayControllerて、InterfaceBuilderテキスト フィールドなどの他の UI 要素を接続したいと考えています。

于 2011-04-27T16:07:57.197 に答える
0

私はこのようにします:

/* 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を使用する必要があります。これにより、このコードはテーブルごとに数回だけ実行されます。

于 2008-10-15T00:08:34.143 に答える
0

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;

これが役立つことを願っています=)

于 2013-06-05T10:48:55.247 に答える
0

ここでは、より現代的なアプローチを提供したいと思います。

iOS 5 以降、UITableView にはメソッドがあります。

(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

セルを含むNIBを登録したら、使用するだけです

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

新しいセルを取得します。セルが再利用できる場合は、それが返されます。それ以外の場合は、新しいセルが自動的に作成されます。その場合、これは NIB ファイルからロードされることを意味します。

于 2014-05-07T10:48:15.417 に答える
-1

UITableViewCellyourを 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;
于 2008-12-27T13:11:37.440 に答える