Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

View-Based NSTableView in Swift - How to

I have a NSTableView whose cells are view-based.

DataSource & Delegate are connected, but I'm not able to display the cell's textField string value.

This is the code in Objective-C, working:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {

return 10;

}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

        NSTableCellView *cell = [tableView makeViewWithIdentifier:@"List" owner:self];
        [cella.textField setStringValue:"Hey, this is a cell"];

        return cell;
}

And here is my code in Swift, not working :

func numberOfRowsInTableView(aTableView: NSTableView!) -> Int
{
    return 10 //Casual number
}
func tableView(tableView: NSTableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> NSTableCellView! {
    var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView!
    // setup cell without force unwrapping it
    cell.textField.stringValue = "Hey, this is a cell"
    println("Method called") //Never printed
    return cell
}

This is the result: (table on right side of image)

Note that the comment //setup cell without force unwrapping it makes no sense, I forgot to delete it.

Code + ResultTableVie settingsDelegate and DataSource connected

What I am missing ?

Edit: I tried even the following with no success:

func numberOfRowsInTableView(aTableView: NSTableView!) -> Int
{
    return 10
}
func tableView(tableView: NSTableView!, objectValueForTableColumn tableColumn: NSTableColumn!, row: Int) -> AnyObject
{
    var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView
    cell.textField.stringValue = "Hey this is a cell"
    return cell;
}

Thank you all. Alberto

like image 916
Alberto Bellini Avatar asked Jun 21 '14 22:06

Alberto Bellini


3 Answers

After hours of search, I discovered this method that works !

func tableView(tableView: NSTableView, viewForTableColumn: NSTableColumn, row: Int) -> NSView
{
    var cell = tableView.makeViewWithIdentifier("List", owner: self) as NSTableCellView
    cell.textField.stringValue = "Hey, this is a cell"
    return cell;
}
like image 101
Alberto Bellini Avatar answered Nov 09 '22 00:11

Alberto Bellini


I see that you found your answer your self but from what I can see your clue was in the Return Value of Objective -C delegate.

- (NSView *)tableView:...

The return value is a NSView.

But you should look at the Swift/Objective -c documentaion.

From the Docs:

Providing Views for Rows and Columns tableView:viewForTableColumn:row:

Asks the delegate for a view to display the specified row and column.

Declaration
SWIFT
@optional func tableView(_ tableView: NSTableView!,
      viewForTableColumn tableColumn: NSTableColumn!,
                     row row: Int) -> NSView!
OBJECTIVE-C
- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row

Note the -> NSView! in the swift code also.

The new docs allow you to see the code for Swift and Objective -c side by side or one or the other. You can use a selection tab at the top of the documentation to choose.

It also looks like your code should include the "!" for optionals

like image 34
markhunte Avatar answered Nov 08 '22 22:11

markhunte


If you change the content mode of the table view from view based to cell based the method is called.

enter image description here

like image 34
Martin Avatar answered Nov 08 '22 23:11

Martin