On Nov 7, 2013, at 9:07 AM, Joshua Ballanco <jball...@gmail.com> wrote:
> * MacRuby integration with Xcode relies on rb-nibtool, but the Xcode team has > repeatedly signaled (not so subtly) that they are not interested in keeping > this shim working. I assume that rb-nibtool scans rb files to identify possible IBOutlet and IBAction targets. If this is it's only function then I would not miss it if it goes away. I have discovered that it is easy to define IBOutlet and IBAction targets in Objective-C files without recoding any ruby code into Objective-C. The results are much better because the linkage and error messages are very fast while the scanning of ruby files gets very slow on a large project. To avoid adding a lot of files, I created a single Objective-C .h and .m file for each of my nib files, including the main, giving it a corresponding name. // MainWindow.h // RiceCNC // // Created by Robert Rice on 11/9/13. // Copyright (c) 2013 Robert Rice. All rights reserved. // #import <Foundation/Foundation.h> @interface AppDelegate : NSObject @property (weak) IBOutlet id template_menu; @property (weak) IBOutlet id example_menu; - (IBAction)makeNewMachine:(id)sender; - (IBAction)makeNewEngine:(id)sender; @end // MainWindow.m // RiceCNC // // Created by Robert Rice on 11/9/13. // Copyright (c) 2013 Robert Rice. All rights reserved. // #import "MainWindow.h" @implementation AppDelegate @synthesize template_menu; @synthesize example_menu; - (IBAction)makeNewMachine:(id)sender {}; - (IBAction)makeNewEngine:(id)sender {}; @end The IBActions are easy. I simply define empty methods for my actions. MacRuby will replace the empty methods with the ruby methods. For each IBOutlet, I define a C property, remove the attr_writer or attr_accessor from my ruby class, then reference the property from my ruby class using the dot syntax. For this example, I changed @template_menu to self.template_menu and @example_menu to self.example_menu: # AppDelegate.rb # MacCNC # # Created by Robert Rice on 3/10/12. # Copyright 2012 Rice Audio. All rights reserved. class AppDelegate # attr_writer :template_menu, :example_menu def init if super # ErrorLog.instance.debug( "AppDelegate init" ) end @pdf_window_controller = nil @mail_bridge_window_controller = nil self end def awakeFromNib # ErrorLog.instance.debug( "AppDelegate awakeFromNib" ) bundle = NSBundle.mainBundle engines = bundle.pathsForResourcesOfType( "engine", inDirectory:"Templates" ) engines.each do | path | title = path.split( '/' ).last.split( '.' ).first item = self.template_menu.addItemWithTitle( title, action:"open_engine_template:", keyEquivalent:"" ) item.setTarget( self ) end examples = bundle.pathsForResourcesOfType( "cnc", inDirectory:"Examples" ) examples.each do | path | title = path.split( '/' ).last.split( '.' ).first item = self.example_menu.addItemWithTitle( title, action:"open_document_template:", keyEquivalent:"" ) item.setTarget( self ) end end def makeNewMachine( sender ) makeNewDocument( "Machine" ) end def makeNewEngine( sender ) makeNewDocument( "Engine" ) end def makeNewDocument( type ) ErrorLog.instance.warn( "makeNewDocument #{ type }" ) nserror = Pointer.new( :object ) controller = NSDocumentController.sharedDocumentController document = controller.makeUntitledDocumentOfType( type, error:nserror ) if document controller.addDocument( document ) document.makeWindowControllers document.showWindows else ErrorLog.instance.error( "Error creating new #{ type } Document" ) end document end def open_engine_template( sender ) open_file( NSBundle.mainBundle.pathForResource( sender.title, ofType:"engine", inDirectory:"Templates" ) ) end def open_machine_template( sender ) open_file( NSBundle.mainBundle.pathForResource( sender.title, ofType:"machine", inDirectory:"Templates" ) ) end def open_document_template( sender ) open_file( NSBundle.mainBundle.pathForResource( sender.title, ofType:"cnc", inDirectory:"Examples" ) ) end def open_file( path ) url = NSURL.fileURLWithPath( path ) nserror = Pointer.new( :object ) NSDocumentController.sharedDocumentController.openDocumentWithContentsOfURL( url, display:true, error:nserror ) end end
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org https://lists.macosforge.org/mailman/listinfo/macruby-devel