Thanks Brian!
that cleared up all the remaining puzzles !
I must admit i just assumed that the data source and delegate were
married together in some way in hotcocoa - now that you have given me
a much better background it all now makes sense.
And thanks for the link.
Cheers,
John
On Apr 1, 2009, at 8:07 PM, Brian Chapados wrote:
You might have already figured this out, but in case it helps...
Be careful not to confuse the TableView delegate with the DataSource
delegate.
Check out the TableView programming guide:
http://developer.apple.com/documentation/Cocoa/Conceptual/TableView/TableView.html
You can use two different sets of delegate messages to customize an
NSTableView. The datasource delegate methods get called in order to
populate the table with data. The TableView delegate methods get
called in response to user-generated events.
The DataSource informal protocol:
http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html#/
/apple_ref/occ/cat/NSTableDataSource
delegate methods specific for a TableView:
http://developer.apple.com/documentation/Cocoa/Conceptual/TableView/Tasks/UsingTableDelegate.html#/
/apple_ref/doc/uid/20000116-CJBDHFIC
Your tableview delegate can also respond to delegate messages for
NSControl and NSView (its superclasses).
In your list below,
#is not delegated to
def tableView(tv, setObjectValue:anObject, forTableColumn:col,
row:row)
NSLog("tableView setObject")
#edit data here
end
#is not delegated to
def numberOfRowsInTableView(tv)
NSLog("numberOfRowsInTableView")
0 #test 0
end
#is not delegated to
def tableView(tv, objectValueForTableColumn:col, row:row)
NSLog("objectValueForTableColumn")
val = "richard"
end
These methods are sent to the 'dataSource' delegate, not the
'delegate' (view delegate). In order for your dataSource delegate
methods to be called, you need to either:
1. Define the methods in a separate class, and assign an instance of
that class as:
@tableView.dataSource = myDataSource
2. Define the methods in your TableView Controller class, set the
dataSource delegate to self:
@tableView.dataSource = self
You _must_ set the tableView delegate in order to receive the
messages, even if you have everything in one class and you just want
to set them to 'self'.
For simple cases, you can implement both the 'dataSource' and view
'delegate' classes in your TableView controller and set both delegates
to self. For an example of this, see the FlickrDemo example app in
macruby-examples dir.
Also, since it was mentioned, you should be able to leave the 'target'
property unset (or set it to nil). In cocoa, nil targeted actions do
_not_ go into the void. Instead, they sent are passed along the
responder chain so that the next appropriate control can handle the
message. This is useful for when you want to the same action to be
performed as a result of different inputs (i.e. menu, button or click
in row, ect..). You can just define the action methods in a class
that is part of the responder chain and send a nil targeted actions
from your controls.
There is must-listen Mac-Developer Network podcast interview with
Aaron Hillegass on the Responder Chain:
http://www.mac-developer-network.com/shows/podcasts/lnc/lnc009/
Brian
2009/4/1 John Shea <johnmacs...@gmail.com>:
Hi Dave,
thanks for your answer.
On Apr 1, 2009, at 14:39 , Dave Baldwin wrote:
I haven't had any problems using delegate methods. For example I do:
@tableView.delegate = self
and define a delegate method:
def tableView (table, shouldEditTableColumn: c, row: r)
false
end
Thats the first thing I tried - but for the tableView(table,
setObjectValue
.. method which was not delegated to.
Unfortunately as it was the first one i tried (because i wanted to
edit
table fields) - that sent me on a wild goose chase trying to
figure out why
the delegate was not working as it was in all of my non-hotcocoa
code.
So thanks for pointing out that some of them are actually delegated
to.
For me:
#works
def controlTextDidChange(notification)
NSLog("controlTextDidChange #{notification.object}")
NSLog(@mv_table_view.selectedRow.to_s)
end
#works
def tableView(tv, willDisplayCell:cell, forTableColumn:col,
row:the_row)
NSLog("willDisplayCell")
end
#works
def tableViewSelectionDidChange(notification)
NSLog("tableViewSelectionDidChange")
end
#is not delegated to
def tableView(tv, setObjectValue:anObject, forTableColumn:col,
row:row)
NSLog("tableView setObject")
#edit data here
end
#is not delegated to
def numberOfRowsInTableView(tv)
NSLog("numberOfRowsInTableView")
0 #test 0
end
#is not delegated to
def tableView(tv, objectValueForTableColumn:col, row:row)
NSLog("objectValueForTableColumn")
val = "richard"
end
I could probably do a work around with controlTextDidChange - but
it seems a
bit dodgy.
Or another option would be to edit not within the table, but in
another
form.
I suppose there is some simple explanation - but I am missing it
for the
moment.
Cheers,
J
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel