View-Based NSTableView in Swift - How to

别来无恙 提交于 2019-12-21 04:50:10

问题


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.

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


回答1:


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;
}



回答2:


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




回答3:


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




回答4:


This beat me up for an hour. Works with Swift 2.2, probably won't work for earlier or later versions:

 let cell = tableView.makeViewWithIdentifier(myid!, owner: nil)  // You can't cast this with as! like they want you to

    if let mycell = cell as? NSTableCellView {
        mycell.textField?.stringValue = text
        return mycell
    }


来源:https://stackoverflow.com/questions/24346363/view-based-nstableview-in-swift-how-to

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!