Is it possible to design NSCell subclasses in Interface Builder?

后端 未结 10 1235
终归单人心
终归单人心 2020-12-13 15:09

I\'m trying to subclass NSCell for use in a NSTableView. The cell I want to create is fairly complicated so it would be very useful if I could design it in Interface Builder

相关标签:
10条回答
  • 2020-12-13 15:43

    Some answers in this thread have gone off topic because they're talking about Cocoa Touch, when the original question was about Cocoa - the 2 APIs are quite different in this regard and Cocoa Touch makes it easy because UITableViewCell is a view subclass. NSCell isn't, and that's the problem

    For information, I had to do something very similar in NSOutlineView recently - which is basically the same, but a little harder if anything because you have to deal with disclosure / collapse of levels. If you're interested in the code, I posted about it here: http://www.stevestreeting.com/2010/08/08/cocoa-tip-using-custom-table-outline-cells-designed-in-ib/

    HTH

    0 讨论(0)
  • 2020-12-13 15:43

    Add your UITableViewCell to your tableviewcontroller and declare an IBOutlet property:

    @interface KuguTableViewController : UITableViewController {
        IBOutlet UITableViewCell *customTypeCell;
    }
    
    @property (readonly)  UITableViewCell *customTypeCell;
    

    ... then in cellForRowAtIndexPath you can just use your cell and set it to be reused:

    static NSString *CellIdentifier = @"CustomCell"
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
            cell = customTypeCell;
            cell.reuseIdentifier = CellIdentifier;
    
    0 讨论(0)
  • 2020-12-13 15:50

    I do it like this:

    /* 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);
    }
    

    However it isn't very efficient and if you're loading lot of data it might hurt you. Of course you should be using a reuseIdentifier which should force this code to only run a handful of times per table.

    0 讨论(0)
  • 2020-12-13 15:53

    1) Create NSViewController TableViewCell.h

    2) Create in TableViewCell.h some procedures like

    -(void)setText:(NSString *)text image:(NSImage *)image
    

    3) In Main class #import "TableViewCell.h"

    4) In Main class in -(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;
    

    Hope this will help =)

    0 讨论(0)
提交回复
热议问题