[Mono-osx] MonoMac NSTableView Scroll Crash

Jon Lipsky jon.lipsky at elevenworks.com
Fri Mar 1 19:18:27 UTC 2013


Hi Landon,

Sounds to me like you aren't holding a reference to your DataSource instance, so it is getting garbage collected on the Mono side of things.  Mono is trying to call that non-existant constructor when it's trying to re-create the object from it's Objective-C peer.

Change your code to something like this:

DashboardReportDataSource datasource;

public override void LoadView ()
{
    base.LoadView ();
    datasource = new DashboardReportDataSource();
    tblDashboardReport.DataSource = datasource; 
}

Jon..

On Mar 1, 2013, at 11:08 AM, Landon Campbell <campbelllandon at hotmail.com> wrote:

> Hi everybody,
> 
> I'm a MonoMac noob, and I'm trying to get an NSTableView to work in my application. I followed two examples to implement my solution:
> 
> http://www.milkcarton.com/blog/2010/07/05/Databinding+To+An+NSTableView+With+A+MonoMac+App.aspx
> http://www.netneurotic.net/Mono/MonoMac-NSTableView.html
> 
> I created a datasource class according to these articles, and my NSTableView loads the data without any problem. Here's the basic code:
> 
> DataSource class:
> [Register("TableViewDataSource")]
> public class DashboardReportDataSource : NSTableViewDataSource
> {
>     private List<Reseller> _resellers;
> 
>     public DashboardReportDataSource ()
>     {
>         var domainRepository = new DomainRepository();
> 	_resellers = domainRepository.GetClientResellers(161);
>     }
> 
>     [Export("numberOfRowsInTableView:")]
>     public int NumberOfRowsInTableView (NSTableView tableView)
>     {
>         if (_resellers == null) {
> 	    return 0;
> 	else {
> 	    return _resellers.Count;
> 	}
>     }
> 
>     [Export("tableView:objectValueForTableColumn:row:")]
>     public NSObject objectValueForTableColumn (NSTableView aTableView, NSTableColumn aTableColumn, int rowIndex)
>     {
>         switch (aTableColumn.Identifier.ToString()){
> 	    case "colProductId" :
> 	        return new NSString(_resellers[rowIndex].Id.ToString());
>             case "colResellerId" :
> 	        return new NSString(_resellers[rowIndex].Name);
> 	    default:
> 	        return new NSString("");
>          }
>     }
> }
> 
> Populate table in my custom NSView class:
> public override void LoadView ()
> {
>     base.LoadView ();
>     tblDashboardReport.DataSource = new DashboardReportDataSource();
> }
> 
> My domain repository calls SQL Server and populates the generic list. Like I said, the load is fine (actually super-fast), but if I scroll to the bottom of my table view, then start to scroll back up, the app crashes, every single time. This is the error I'm getting:
> 
> System.MissingMethodException: No constructor found for DashboardReportDataSource::.ctor(System.IntPtr)
>   at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x000fd] in /Users/builder/data/lanes/mono-mac-ui-refresh-2-10/2baeee2f/source/bockbuild/profiles/mono-2-10/build-root/mono-2.10.11/_build/mono-2.10.11.git/mcs/class/corlib/System/Activator.cs:280
>   at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in /Users/builder/data/lanes/mono-mac-ui-refresh-2-10/2baeee2f/source/bockbuild/profiles/mono-2-10/build-root/mono-2.10.11/_build/mono-2.10.11.git/mcs/class/corlib/System/Activator.cs:234
>   at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in /Users/builder/data/lanes/mono-mac-ui-refresh-2-10/2baeee2f/source/bockbuild/profiles/mono-2-10/build-root/mono-2.10.11/_build/mono-2.10.11.git/mcs/class/corlib/System/Activator.cs:229
>   at MonoMac.ObjCRuntime.Runtime.GetNSObject (IntPtr ptr) [0x00000] in <filename unknown>:0
>   at MonoMac.ObjCRuntime.NSObjectMarshaler`1[MonoMac.Foundation.NSObject].MarshalNativeToManaged (IntPtr handle) [0x00000] in <filename unknown>:0
>   at (wrapper native-to-managed) object:[DashboardReportDataSource:MonoMac.Foundation.NSObject objectValueForTableColumn(MonoMac.AppKit.NSTableView, MonoMac.AppKit.NSTableColumn, Int32)] (MonoMac.Foundation.NSObject,MonoMac.ObjCRuntime.Selector,MonoMac.AppKit.NSTableView,MonoMac.AppKit.NSTableColumn,int)
>   at (wrapper managed-to-native) MonoMac.AppKit.NSApplication:NSApplicationMain (int,string[])
>   at MonoMac.AppKit.NSApplication.Main (System.String[] args) [0x00000] in <filename unknown>:0
>   at BPA.UI.Mono.Mac.MainClass.Main (System.String[] args) [0x00005] in /Users/User/Projects/Repositories/BPA.UI.Mono/BPA.UI.Mono.Mac/Main.cs:14
> 
> Seems like an odd issue, since it claims the class doesn't have a constructor, which it obviously does. I could really use some help -- does anybody have any idea what I'm doing wrong?
> 
> System:
> Mono 2.10.11
> MonoDevelop 3.1.1
> XCode 4.6
> Lastest MonoMac add-in (Xamarin.Mac 3.1.1, open-source)
> Mac OS X Lion (running in VMWare Player)
> 
> Thanks for you help,
> Landon
> _______________________________________________
> Mono-osx mailing list
> Mono-osx at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-osx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-osx/attachments/20130301/c68f898f/attachment-0001.html>


More information about the Mono-osx mailing list