Skip to content

Instantly share code, notes, and snippets.

@chamons

chamons/foo.cs Secret

Created January 2, 2019 14:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chamons/aa048f9d9db7a5252504a98c12fc81ee to your computer and use it in GitHub Desktop.
Save chamons/aa048f9d9db7a5252504a98c12fc81ee to your computer and use it in GitHub Desktop.
using System;
using AppKit;
using Foundation;
namespace SavePanelTest
{
public static class NSSavePanelPatch
{
[System.Runtime.InteropServices.DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSend")]
extern static IntPtr IntPtr_objc_msgSend (IntPtr receiver, IntPtr selector);
public static NSSavePanel GetSavePanel ()
{
return ObjCRuntime.Runtime.GetNSObject<NSSavePanel> (IntPtr_objc_msgSend (ObjCRuntime.Class.GetHandle ("NSSavePanel"), ObjCRuntime.Selector.GetHandle ("savePanel")));
}
}
[Register ("AppDelegate")]
public class AppDelegate : NSApplicationDelegate
{
public override void DidFinishLaunching (NSNotification notification)
{
var panel = NSSavePanelPatch.GetSavePanel ();
panel.RunModal ();
}
}
}
@ShammyLevva
Copy link

ShammyLevva commented Jan 2, 2019

Thanks for that very helpful. I'm getting an invalid cast though

I changed my code to

      public static void Export(DataTable dt, string exportType)
        {
            NSSavePanel dlg = NSSavePanelPatch.GetSavePanel();
            dlg.Title = "Export data to Excel";
            dlg.AllowedFileTypes = new string[] { "csv" };
            dlg.Message = "Select location to export file to";
            dlg.NameFieldStringValue = exportType;
            if (dlg.RunModal().Equals(NSModalResponse.OK))
            {
                WriteFile(dt, dlg.Url.Path);
                ShowMessage($"File written to {dlg.Url.Path}", "FTAnalyzer");
            }
        }

and get error...

System.InvalidCastException: Specified cast is not valid.
  at at (wrapper castclass) System.Object.__castclass_with_cache(object,intptr,intptr)
  at ObjCRuntime.Runtime.ConstructNSObject[T] (System.IntPtr ptr, System.Type type, ObjCRuntime.Runtime+MissingCtorResolution missingCtorResolution, System.IntPtr selector, System.IntPtr method) [0x00048] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.12/src/Xamarin.Mac/ObjCRuntime/Runtime.cs:1094
  at ObjCRuntime.Runtime.GetNSObject[T] (System.IntPtr ptr) [0x00103] in /Library/Frameworks/Xamarin.Mac.framework/Versions/5.2.1.12/src/Xamarin.Mac/ObjCRuntime/Runtime.cs:1221
  at FTAnalyzer.UIHelpers+NSSavePanelPatch.GetSavePanel () [0x00001] in /Users/alexander/Projects/FTAnalyzer/FTAnalyzer/Utilities/UIHelpers.cs:44
  at FTAnalyzer.Utilities.ExportToExcel.Export (System.Data.DataTable dt, System.String exportType) [0x00001] in /Users/alexander/Projects/FTAnalyzer.Shared/FTAnalyzer.Shared/Exports/ExportToExcel.cs:42
  at FTAnalyzer.AppDelegate.ExportIndividuals (Foundation.NSObject sender) [0x00035] in /Users/alexander/Projects/FTAnalyzer/FTAnalyzer/AppDelegate.cs:135

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment