Funny that several people say that there’s no need to know when the questioner obviously does have that need. And there are good reasons you might want to know this; e.g. if you implement a generic NSTableView subclass or delegate, you must differentiate its behavior dependent on whether the table view is view- or cell-based.
If you use an NSArrayController and bindings, an easy way is to check for NSTableColumn bindings, because cell-based NSTableViews do have these, and view-based NSTableViews do not. So this code fragment will work:
NSTableColumn *tableColumn = [[myTableView tableColumns] objectAtIndex:0];
NSDictionary *binding = [tableColumn infoForBinding:@"value"];
if (binding) {...} // cell-based table view
else {...} // view-based table view
I haven’t tried myself, but if you use an NSTableViewDataSource instead, you’d probably simply check whether the data source responds to - tableView:setObjectValue:forTableColumn:row:
(cell-based table view) or not (view-based table view).