OS X YosemiteΪAutomationÒýÈëÁËJavascriptµÄÖ§³Ö¡£ÕâÈÃÔÚÔÉúOS
X¿ò¼ÜÖÐʹÓÃJavascript³ÉΪ¿ÉÄÜ¡£¹ýÈ¥Ò»¶Îʱ¼äÎÒÒ»Ö±ÔÚ̽Ë÷Õâ¸öÐÂÁìÓò£¬²¢ÊÕ¼¯ÁËһЩʾÀý¡£ÔÚÕâÆªÎÄÕÂÀïÎÒÏë½âÊÍһϻù±¾Ó÷¨²¢ÇҴһ¸öСµÄʾÀýÓ¦Óá£
WWDC 2014°üº¬Ò»¸öJavascript for AutomationµÄ session¡£Õâ¸ösession½²Ã÷ÁËÔÚautomateÓ¦ÓÃÀï¿ÉÒÔÓÃJavascript´úÌæAppleScriptÀ´½øÐпª·¢¡£Õâ±¾Éí¾ÍÊÇÒ»¸ö¼¤
¶¯ÈËÐĵÄÏûÏ¢¡£Ê¹ÓÃAppleScriptÀ´×Ô¶¯»¯Öظ´ÐÔÈÎÎñÒѾ´æÔںܳ¤Ê±¼äÁË¡£AppleScriptдÆðÀ´²¢²»ÊÇÌØ±ðÊæ·þ£¬ËùÒÔÄܹ»Ê¹ÓÃÀàËÆµÄÓï·¨
À´´úÌæ»¹ÊǺÜÊÜ»¶ÓµÄ¡£
ÔÚsessionÀïÑݽ²Õß»¹½âÊÍÁËObjective-C bridge£¬ÕâÈÃÕû¸öÊÂÇ鿪ʼ±äµÃÌØ±ð¿á¡£bridgeÔÊÐíÄãµ¼ÈëÈκÎObjective-C¿ò¼Üµ½JSÓ¦ÓÃÀï¡£±ÈÈ磬Èç¹ûÄãÏë´î½¨Ò»¸öʹÓñê×¼OS
X¿Ø¼þµÄGUIʱ£¬Äã¿ÉÒÔµ¼ÈëCocoa£º
Foundation¿ò¼ÜÔòºÍËüµÄÃû×ÖÒ»Ñù£¬¸øOS XÓ¦ÓÃÌṩ»ù´¡¹¹¼þ¡£Ëü°üº¬´óÁ¿µÄÀàºÍ½Ó¿Ú£¬±ÈÈçNSArray¡¢NSURL¡¢NSUserNotificationµÈµÈ¡£¿ÉÄÜÄã¶ÔÕâЩÀ໹²»ÊÇÌ«ÊìϤ£¬
µ«´ÓÃû×ÖÄã¿ÉÒԲ³öËüÃÇ´ú±íµÄÒâ˼¡£ÓÉÓÚËüÊÇÈç´ËÖØÒª£¬ÄãÎÞÐèÔÚ¿ª·¢Öе¼ÈëËü£¬ÒòΪËüÒѾĬÈϰüº¬ÔÚÀïÃæÁË¡£
´ÓÎÒĿǰÁ˽âµÄÇé¿ö¿´£¬ÈκÎÄÜÓÃObjective-CºÍSwift¿ª·¢µÄ³ÌÐò£¬Äã¶¼ÄÜÓÃJavascriptÀ´¿ª·¢¡£
¿ª·¢Ò»¸öʾÀý³ÌÐò
×¢Ò⣺ÄãÐèÒªYosemite Developer Preview 7+À´±£Ö¤Ê¾ÀýÄܹ»Õý³£ÔËÐС£
Á˽âJavascript for AutomationµÄ×îºÃ°ì·¨ÊÇͶÈë½øÈ¥£¬²¢¿ªÊ¼ÓÃËüÀ´¿ª·¢Ò»Ð©¶«Î÷¡£ÕâÀïÎÒ½«ÑÝʾÈçºÎ´´½¨Ò»¸öС³ÌÐò£¬ÄÜÈÃÄã´ÓµçÄÔÖÐÑ¡ÔñÒ»ÕÅͼƬ²¢ÏÔʾ¡£
¿ÉÒÔ´ÓÎÒµÄʾÀý³ÌÐò²Ö¿âÀïÏÂÔØÍêÕûµÄ´úÂë¡£

ÎÒÃÇ´´½¨µÄÓ¦ÓõÄÒ»ÕŽØÍ¼
Õâ¸ö³ÌÐò°üÀ¨Ò»¸ö´°¿Ú£¬ÎÄ×Ö±êÇ©£¬ÎÄ×ÖÊäÈë¿ò£¬ÒÔ¼°°´Å¥¡£¶ÔÓ¦µÄÀàÃûÔòÊÇ£ºNSWindow£¬NSTextField£¬NSTextFieldÒÔ¼°NSButton¡£
µã»÷Choose an Image°´Å¥½«ÏÔʾһ¸öNSOpenPanelÀ´ÈÃÄãÑ¡ÔñÎļþ¡£ÎÒÃǽ«ÉèÖÃÑ¡ÔñÃæ°åÏÞÖÆËüÖ»ÄÜ´Ó.jpg/.png/.gifÀïÌôÑ¡Îļþ¡£
ÔÚÑ¡ÖÐÒ»ÕÅͼƬºó£¬ÎÒÃǽ«ÔÚ´°¿ÚÏÔʾËü¡£´°¿Ú»á×Ô¶¯µ÷Õû´óС£¬ÒÔÆ¥ÅäͼƬµÄ³ß´çÒÔ¼°¿Õ¼äµÄ¸ß¶È¡£ÎÒÃÇ»¹½«ÉèÖô°¿ÚµÄ×îС³ß´çÒÔÈ·±£¿Ø¼þÄܹ»ÍêÕûÏÔʾ¡£
ÏîÄ¿ÉèÖÃ
´ò¿ªÎ»ÓÚApplication > UtilitiesÖеÄApple
Script Editor³ÌÐò¡£Ëü²»ÊÇÎÒÓùýµÄ×îºÃµÄ±à¼Æ÷£¬µ«¶ÔÓÚÏÖÔÚÊDZØÒªµÄ£¬´î½¨JS OS X³ÌÐòÐèҪʹÓÃËüµÄÒ»Ð©ÌØÐÔ¡£ÎÒ²»Ì«Çå³þËü±³ºóµÄÔÀí£¬µ«Ëü¿ÉÒÔÏñ³ÌÐòÒ»Ñù±àÒëºÍÔËÐÐÄãµÄ½Å±¾¡£Ëü»¹»á´´½¨Ò»Ð©ÎÒÃÇÐèÒªµÄ¶îÍâµÄÎļþ±ÈÈç
Info.plist£¬ÎÒ¹À¼ÆÆäËûһЩ±à¼Æ÷Ò²ÓÐÕâЩ¹¦ÄÜ£¬²»¹ýÎÒ»¹Ã»À´µÃ¼°²âÊÔËüÃÇ¡£
´ò¿ª²Ëµ¥µÄFile > New»òÕß¿ì½Ý¼ücmd + nÀ´´´½¨ÐÂÎĵµ¡£ÎÒÃÇÐèÒª×öµÄµÚÒ»¼þʾÍÊǽ«ÎĵµÒÔ³ÌÐòµÄ¸ñʽ±£´æ£¬´ò¿ª²Ëµ¥File
> Save»ò¿ì½Ý¼ücmd + sÀ´´ò¿ª±£´æ¶Ô»°¿ò¡£²»ÒªÁ¢¼´È·Èϱ£´æ£¬ÕâÀïÓÐÁ½¸öÑ¡ÏîÊÇÎÒÃÇÐèÒªÉèÖõġ£

Script Editor±£´æ¶Ô»°¿ò£¬ÖØÒªµÄµØ·½ÒÑÓúìÉ«±ê³ö
½«Îļþ¸ñʽ¸ÄΪ¡°Ó¦ÓóÌÐò¡±£¬È»ºóÑ¡ÖС°Stay open after run handler¡±Ñ¡Ïî¡£ÄãÒ²¿ÉÒÔÔÚÖ®ºóÀ´¸üÐÂÕâЩ±£´æÑ¡Ï´ò¿ªFile²Ëµ¥²¢°´×¡Option¼ü£¬Ëü»á³öÏÖ¡°Save
as¡¡±Ñ¡ÏÕâÀïÄã¿ÉÒÔ½øÐÐÉÏÃæµÄ²Ù×÷¡£
Èç¹ûÄ㲻ѡÖС°Stay open after run handler¡±£¬ÄãµÄ³ÌÐò»á´ò¿ª£¬µ«»áÒ»ÉÁ¶ø¹ý£¬È»ºó¹Øµô¡£
ÈÃÎÒÃÇ¿ªÊ¼coding
ÔÚÄãµÄ½Å±¾ÀïÌí¼ÓÏÂÃæÁ½ÐдúÂ룬Ȼºó´ò¿ª²Ëµ¥Script > Run
Application»ò¿ì½Ý¼üopt + cmd + rÀ´ÔËÐгÌÐò¡£
ObjC.import("Cocoa"); $.NSLog("Hieverybody!"); |
¿ÉÒÔ¿´µ½²Ëµ¥À¸ºÍdockÉϵÄͼ±ê£¬ËµÃ÷ÎÒÃǵijÌÐòÊÇÔÚÔËÐе쬵«³ýÁËÕâ¸ö£¬Ã»ÓÐÆäËû±ä»¯¡£
´úÂëÖеġ°Hi everybody!¡±ÄÄÈ¥ÁË£¿»¹ÓÐÄǸö¡°$¡±·ûºÅ£¬ÕâÊÇjQueryÂ𣿴ò¿ª²Ëµ¥File
> Quit»ò¿ì½Ý¼ücmd + q¹Ø±Õ³ÌÐò£¬ÎÒÃÇÀ´¿´¿´NSLogÅÜÄÄÈ¥ÁË¡£
ͨ ¹ýϵͳ²Ëµ¥Applications > Utilities > Console´ò¿ªConsole³ÌÐò¡£ËùÓгÌÐòÄܹ»ÔÚ¿ØÖÆÌ¨ÀïµÄÊä³öÐÅÏ¢¡£Õâ¸ö¿ØÖÆÌ¨ºÍChrome¡¢FirefoxÒÔ¼°SafariÀïµÄ¿ª·¢Õß¹¤¾ß²î²»¶à¡£Ö÷񻂿±ðÊÇÕâ¸öÊÇÓÃÀ´µ÷ÊÔ³ÌÐò¶ø²»ÊÇÍøÕ¾µÄ¡£
¿ØÖÆÌ¨³ä³â×ÅÐí¶àÐÅÏ¢£¬Äã¿ÉÒÔÔÚËÑË÷¿òÀïÊäÈëappletÀ´¹ýÂËÄãËùÐèÒªµÄ¡£ÏÖÔÚÄãÐèÒª»Øµ½Script
EditorÖØÐÂÔËÐгÌÐò£¬ÍƼöʹÓÿì½Ý¼üopt + cmd +r¡£

¿´µ½Ã»ÓУ¿ÎÒÃǵġ°Hi, everybody!¡±ÒѾÏÔʾÔÚ¿ØÖÆÌ¨ÀïÁË¡£
¡°$¡±´ú±íʲôÒâ˼£¿
¡°$¡±±íʾµÄÊÇÁ¬½Óµ½Objective-C bridge¡£ÐèÒªµ¼ÈëObjective-CÀà»òÕß³£Á¿£¬¾ÍÓÃ$.foo»òObjc.foo¡£ºóÃæÎÒ»¹»á½²µ½ºÜ¶àÆäËûʹÓõ½$µÄµØ·½¡£
Console³ÌÐòºÍNSLogÊǵ÷ÊÔ³ÌÐò¹ý³ÌÖв»¿É»òȱµÄ¹¤¾ß¡£Èç¹ûÄãÐèÒªÊä³ö×Ö·û´®ÒÔÍâµÄ¶«Î÷£¬ÕâÀïÓÐÎÒµÄNSLogʾÀý¡£
´´½¨´°¿Ú
ÈÃÎÒÃÇÀ´´´ÔìһЩÎÒÃÇÄÜ¿´¼û²¢ÄÜÓëÖ®½»»¥µÄ¶«Î÷¡£½«ÏÂÃæµÄ´úÂëÌæ»»Ö®Ç°½Å±¾ÖеĴúÂ룺
ObjC.import("Cocoa");
varstyleMask=$.NSTitledWindowMask|$.NSClosableWindowMask|$.NSMiniaturizableWindowMask;
varwindowHeight=85;
varwindowWidth=600;
varctrlsHeight=80;
varminWidth=400;
varminHeight=340;
varwindow=$.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer(
$.NSMakeRect(0,0,windowWidth,windowHeight),
styleMask,
$.NSBackingStoreBuffered,
false
);
window.center;
window.title="ChooseandDisplayImage";
window.makeKeyAndOrderFront(window); |
±£´æ´úÂëºó£¬Ê¹Óÿì½Ý¼üopt + cmd + rÔËÐгÌÐò¡£¿´¿´ÎÒÃǵijɹû£¡½ö½ö¼¸ÐдúÂ룬ÎÒÃǾͿÉÒÔ´´½¨Ò»¸ö³ÌÐò£¬ÓµÓдò¿ªÒ»¸ö´°¿Ú²¢Òƶ¯¡¢×îС»¯ºÍ¹Ø±ÕËüµÄ¹¦ÄÜ¡£

ʹÓÃJS´´½¨µÄÒ»¸ö»ù±¾µÄNSWindow
Èç¹ûÄã֮ǰ´ÓδʹÓùýObjective-C»òCocoaÀ´Ð´³ÌÐò£¬ÉÏÃæµÄ´úÂë¿ÉÄÜ¿´ÆðÀ´Óеã»ìÂÒ¡£¶ÔÎÒÀ´Ëµ£¬´úÂëÀïµÄ·½·¨Ãû¼òֱ̫³¤ÁË£¬ÎÒϲ»¶ÃèÊöÐÔµÄÃüÃû£¬µ«Cocoa°ÑËüÍÆÏòÁËÒ»¸ö¼«¶Ë¡£
ºöÂÔÕâÒ»¶Î£¬Äã»á·¢ÏÖËü½ö½öÊÇJavascript£¬ËüºÍÄã´î½¨ÍøÕ¾Ê±ÓõĴúÂëûÓÐÈκβ»Í¬¡£
µÚÒ»ÐдúÂëÀïµÄstyleMask±íʾ£¬ÄãʹÓÃËüÃÇÀ´ÉèÖô°¿ÚÑùʽ£¬Ã¿Ò»¸öÑùʽѡÏî´ú±íÕâËüËùÌí¼ÓµÄ£º±êÌâ¡¢¹Ø±Õ°´Å¥¡¢×îС»¯°´Å¥£¬ÕâЩѡÏîÊDz»±äµÄ¡£È»ºóʹÓá°|¡±½«ËüÃǸô¿ª¡£
Äã¿ÉÒÔÔÚÆ»¹û¹Ù·½ÎĵµÀï»ñÈ¡¸ü¶àµÄÑùʽѡÔñ¡£NSRsizebleWindowMaskÊÇÆäÖÐÒ»¸öÄã»áÓõ½µÄ¡£ÊÔÊÔ½«ËüÌí¼Óµ½style
maskÀï¿´¿´»áËüÓÐʲôÓô¦¡£
¹Ø ÓÚÓï·¨ÓÐһЩ¶«Î÷ÊÇÄã±ØÐë¼ÇסµÄ¡£$.NSWindow.allocµ÷ÓÃNSWindowµÄalloc·½·¨£¬×¢ÒâÔÚallocµÄºóÃæÃ»ÓС°()¡±¡£ÔÚJSÀïÃæÕâÖÖ·½·¨ÊÇÓÃÀ´µ÷ÓÃÊôÐÔ¶ø²»ÊÇ·½·¨µÄ¡£ÔÚJS
for OS XÀïÔ²À¨ºÅÖ»ÓÐÔÚÄãÏò·½·¨´«Èë²ÎÊý²ÅʹÓá£Èç¹ûûÓдø²ÎÊý£¬Äã»á»ñµÃÒ»¸öÔËÐÐʱ´íÎó¡£Èç¹ûÊÂÇéºÍÄãÔ¤ÆÚ²»Ò»Ö£¬×¢Òâ¼ì²éConsoleÀïµÄ´íÎó¡£
½ÓÏÂÀ´¾ÍÊdz¬¼¶³¤µÄ·½·¨ÃûÁË¡£
initWithContentRectStyleMaskBackingDefer |
²é¿´NSWindowÎĵµÀï¹ØÓÚÕâ¸ö·½·¨µÄ²¿·ÖÄã»á·¢ÏÖËüÓÐЩ²»Í¬¡£
initWithContentRect:styleMask:backing:defer: |
ÔÚObjective-CÀïÄãÐèÒªÓÃÏÂÃæµÄ´úÂëÀ´´´½¨Í¬ÑùµÄ´°¿Ú¡£
NSWindow*window[[NSWindowalloc] initWithContentRect:NSMakeRect(0,0,windowWidth,windowHeight) styleMask:styleMask, backing:NSBackingStoreBuffered defer:NO]; |
µ±Ä㽫Objective-C·½·¨×ª»»µ½JSÀïµÄʱºò£¬ÄãÐèҪȥµôðºÅ²¢½«ÆäºóµÄ×Öĸ¸Ä³É´óд¡£¶ø±»¡°[]¡±°üΧµÄÔò½Ð×öÀà»òÕß¶ÔÏóµÄ·½·¨¡£[NSWindow
alloc]µ÷ÓÃNSWindowµÄalloc·½·¨¡£×ª»»µ½JSµÄʱºòÈ¥µô·½À¨ºÅ²¢ÇÒÓá°.¡±½«ËüÃÇÁ¬½ÓÆðÀ´¡£
ÎÒÈÏΪ´úÂëµÄÆäËû²¿·ÖÓ¦¸Ã¹»Ö±¹ÛµÄ£¬ÕâÀï¾Í²»Ï¸½²ÁË¡£ÒªÅªÇå³þÿһÐдúÂëµÄÒâÒ壬Äã¿ÉÒÔÈ¥¿´¹Ù·½Îĵµ¡£Ö»ÒªÄã³É¹¦ÏÔʾÁË´°¿Ú˵Ã÷ĿǰΪֹÄã×öµÄ»¹²»´í£¬ÈÃÎÒÃǸü½øÒ»²½¡£
Ìí¼Ó¿Ø¼þ
ÔÚ´°¿ÚÀïÎÒÃÇ»¹ÐèÒªÒ»¸ö±êÇ©¡¢Îı¾Óò£¬ÒÔ¼°Ò»¸ö°´Å¥¡£ÎÒÃǽ«Ê¹ÓÃNSTextFieldºÍNSButtonÀ´ÏÔʾËüÃÇ¡£½«ÄãµÄ´úÂë¸üгÉÏÂÃæÄÇÑù£¬È»ºóÔËÐгÌÐò¡£
ObjC.import("Cocoa");
varstyleMask=$.NSTitledWindowMask|$.NSClosableWindowMask|$.NSMiniaturizableWindowMask;
varwindowHeight=85;
varwindowWidth=600;
varctrlsHeight=80;
varminWidth=400;
varminHeight=340;
varwindow=$.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer(
$.NSMakeRect(0,0,windowWidth,windowHeight),
styleMask,
$.NSBackingStoreBuffered,
false
);
vartextFieldLabel=$.NSTextField.alloc.initWithFrame($.NSMakeRect(25,(windowHeight-40),200,24));
textFieldLabel.stringValue="Image:(jpg,png,orgif)";
textFieldLabel.drawsBackground=false;
textFieldLabel.editable=false;
textFieldLabel.bezeled=false;
textFieldLabel.selectable=true;
vartextField=$.NSTextField.alloc.initWithFrame($.NSMakeRect(25,(windowHeight-60),205,24));
textField.editable=false;
varbtn=$.NSButton.alloc.initWithFrame($.NSMakeRect(230,(windowHeight-62),150,25));
btn.title="ChooseanImage...";
btn.bezelStyle=$.NSRoundedBezelStyle;
btn.buttonType=$.NSMomentaryLightButton;
window.contentView.addSubview(textFieldLabel);
window.contentView.addSubview(textField);
window.contentView.addSubview(btn);
window.center;
window.title="ChooseandDisplayImage";
window.makeKeyAndOrderFront(window); |
Èç¹ûÒ»ÇÐÕýÈ·µÄ»°ÄãÏÖÔÚ»áµÃµ½ÓпؼþµÄ´°¿Ú¡£Äã²»ÄÜÔÚÎı¾ÓòÀïÊäÈ룬µã»÷°´Å¥Ò²²»»á·¢ÉúÈκÎÊÂÇé¡£²»¹ýÎÒÃǽÓÏÂÀ´»á½²µ½ÄÇÀï¡£

´øÓбêÇ©¡¢ÓòºÍ°´Å¥ÔªËصĴ°¿Ú
ÐÂÌí¼ÓµÄ´úÂëÀïÓÐÊ²Ã´ÄØ£¿textFieldLabelºÍtextFieldÀàËÆ£¬¶¼ÊÇNSTextFieldµÄʵÀý¡£ËüÃǵÄʹÓ÷½·¨ºÍ´´½¨´°¿ÚµÄ´úÂë²î²»¶à¡£initWithFrameºÍNSMakeRectÔòÊǽű¾´´½¨UIÔªËØµÄ·½·¨£¬ËüÃǵÄ×÷ÓÃÕýÈç×ÖÃæÒâ˼¡£
ÔÚ´´½¨Îı¾ÓòÖ®ºóÎÒÃÇ»¹ÐèÒª¸øËüÃÇÉèÖÃһЩÊôÐÔ¡£CocoaûÓкÍhtml±êÇ©ÔªËØÒ»ÑùµÄ¶«Î÷£¬µ«ÎÒÃÇ¿ÉÒÔͨ¹ýÉèÖÃÊôÐÔÀ´´ïµ½Í¬Ò»Ð§¹û¡£
ÎÒÃÇÐèÒªÈóÌÐò×Ô¶¯Ð´Èëµ½Îı¾Óò£¬ËùÒÔ½ûÖ¹ÁËÔÚÀïÃæÊäÈëÎÄ×Ö¡£Èç¹û²»ÐèÒªÕâô×ö£¬Äã¿ÉÒÔÓÃÒ»ÐдúÂëÀ´´´½¨Ò»¸ö±ê×¼µÄÎı¾Óò¡£
¶ÔÓÚ°´Å¥ÎÒÃÇÔòʹÓÃNSButton£¬ºÍÎı¾ÓòÒ»Ñù£¬´´½¨ËüÐèÒª»æÖÆÒ»¸ö³¤·½ÐΣ¬ÐèÒªµÄÊôÐÔÊÇbezelStyleºÍbuttonType£¬Á½¸öµÄÖµ¶¼Êdz£Á¿¡£ÕâÁ½¸öÊôÐÔ¿ØÖÆÈçºÎäÖȾ°´Å¥ÒÔ¼°ËüµÄÑùʽ¡£²é¿´NSButtonÎĵµÀ´¿´ÄãÄÜÓÃËü×öʲô¡£ÎÒͬÑù´´½¨ÁËÒ»¸öʾÀý³ÌÐòÀ´ÏÔʾ²»Í¬ÀàÐͺÍÑùʽµÄ°´Å¥¡£
´ú ÂëÀïÎÒÃÇ×öµÄ×îºóÒ»¼þʾÍÊÇ£¬Ê¹ÓÃaddSubview½«ÔªËØÌí¼Óµ½´°¿Ú¡£µ±ÎÒµÚÒ»´ÎÌí¼ÓµÄʱºòÎÒʹÓÃwindow.addSubview(theView)£¬Õâ¶ÔÓÚÆäËüʹÓÃNSView´´½¨µÄ±ê×¼viewÊÇÊÊÓõ쬵«²»ÊʺÏNSWindowµÄʵÀý¡£ÎÒ²»Ì«Çå³þΪʲô£¬µ«¶ÔÓÚ´°¿ÚÄãÐèÒªÌí¼Ó×ÓÊÓͼµ½contentView£¬ÎĵµÀïÃèÊöcontentView˵¡°´°¿ÚµÄÊÓͼ²ã¼¶Àï×î¸ß¿É·ÃÎÊÐÔµÄNSView¶ÔÏó¡±£¬²âÊÔ¿ÉÐС£
Èð´Å¥ÏìÓ¦µã»÷
µ±µã»÷°´Å¥µÄʱºò£¬ÎÒÏ£ÍûµÃµ½Ò»¸öÑ¡ÔñÎļþµÄÃæ°å¡£ÔÚÔÚ´Ë֮ǰ£¬ÈÃÎÒÃÇÏÈÈÈÏÂÉí£¬³¢ÊÔµ±µã»÷°´Å¥Ê±Êä³öÒ»ÌõÐÅÏ¢µ½ConsoleÀï¡£
ÔÚJavascriptÀïÄã¿ÉÒÔ°ó¶¨Ê¼þ¼àÌýÆ÷µ½ÔªËØÉÏÒÔ´¦Àíµã»÷¡£Objective-CûÓÐÀàËÆµÄ¸ÅÄî¡£ËüʹÓÃÏûÏ¢´«µÝµÄ·½·¨£¬Äã·¢ËͰüº¬·½·¨µÄÐÅÏ¢µ½Ò»¸ö¶ÔÏ󣬶ÔÏóÐèÒªÖªµÀ½ÓÊÕÐÅÏ¢ºóÈçºÎ´¦Àí¡£
ÎÒÃÇÐèÒª×öµÄµÚÒ»¼þÊÂÊǸø°´Å¥Ìí¼ÓtargetºÍaction¡£targetÊÇÎÒÃÇÏ뽫action·¢Ë͵½µÄ¶ÔÏóÃû³Æ¡£ÔÚ´úÂëµÄ°´Å¥ÉèÖÃÇøÓòÌí¼ÓÏÂÃæµÄÊôÐÔ£º
... btn.target=appDelegate; btn.action="btnClickHandler"; ... |
appDelegateºÍbtnClickHandlerÏÖÔÚ»¹²¢²»´æÔÚ£¬ÎÒÃÇÐèÒªÀ´´´½¨ËüÃÇ¡£ÏÂÃæµÄ´úÂëÐèҪ˳Ðò¡£ÎÒÔÚ´úÂëÀï±ê¼ÇÁËÓ¦¸ÃÔÚÄÄÀïÌí¼ÓдúÂë¡£
ObjC.import("Cocoa");
//Newstuff
ObjC.registerSubclass({
name:"AppDelegate",
methods:{
"btnClickHandler":{
types:["void",["id"]],
implementation:function(sender){
$.NSLog("Clicked!");
}
}
}
});
varappDelegate=$.AppDelegate.alloc.init;
//endofnewstuff
//Belowhereisinplacealready
vartextFieldLabel=$.NSTextField.alloc.initWithFrame($.NSMakeRect(25,(windowHeight-40),200,24));
textFieldLabel.stringValue="Image:(jpg,png,orgif)";
... |
ÔËÐÐÓ¦Ó㬵ã»÷Choose Image°´Å¥£¬È»ºó¹Û²ìConsoleµÄÊä³ö¡£Èç¹û¿´µ½ÁË¡°Clicked!¡±£¬ËµÃ÷Ìí¼Ó³É¹¦ÁË¡£Èç¹û²»Êǵϰ£¬×Ðϸ¼ì²éÄãµÄ½Å±¾ÊÇ·ñºÍÉÏÃæÒ»Ñù£¬È»ºó¹Û²ìConsoleÀïÊä³öµÄ´íÎó¡£
Subclassing
Õâ¸öObjc.registerSubclassÊÇÊ²Ã´ÄØ£¿SubclassingÊÇ´´½¨¼Ì³ÐObjective-CÖÐÀàµÄ×ÓÀàµÄ·½·¨¡£×¢Ò⣺ÕâÀïµÄÊõÓïÊÇÎÒ×Ô´´µÄ£¬²»ÒªÔÚÒâÕâЩϸ½Ú¡£registerSubclass½ÓÊÕÒ»¸ö²ÎÊý£º°üº¬Ð¶ÔÏó³ÉÔ±µÄJS¶ÔÏó¡£ÕâЩ³ÉÔ±°üÀ¨£ºname£¬superclass£¬protocols£¬propertiesºÍmethods¡£
ÕâЩ¶¼ÊǺܺõ쬵«ÎÒÃÇÐèÒªÔõô×öÄØ£¿¼øÓÚÎÒÃÇûÓÐÌṩsuperclass£¬ÎÒÃǼ̳ÐÁËNSObject¡£ËüÊÇ´ó¶àÊýObjective-CÀàµÄ¸ùÀࡣȻºóÉèÖÃÒ»¸öÃû³ÆÒÔ±ã´ý»áÎÒÃÇÒýÓÃËü¡£
$.AppDelegate.alloc.init£º´´½¨Ò»¸öAppDeleteÀàµÄʵÀý¡£×¢ÒâÎÒÃÇûÓÐʹÓÃÔ²À¨ºÅ£¬ÒòΪÕâÀïËüÃDz»ÐèÒª½ÓÊܲÎÊý¡£
Subclass·½·¨
Äã¿ÉÒÔ¸ø·½·¨¶¨ÒåÈκοɽÓÊܵÄÃû³Æ¡£ÔÚÕâÀïÎÒÃÇÓÃbtnClickHandler¡£¸øËüÒ»¸ö´øÓÐtypesºÍimplementation³ÉÔ±µÄ¶ÔÏó¡£ÎÒûÓÐÔÚ¹Ù·½ÎĵµÀïÕÒµ½typesÊý×éÐèÒª°üº¬µÄÔªËØ£¬Í¨¹ý³¢ÊÔÎÒ·¢ÏÖËüÊÇÕâÑùµÄ£º
["returntype",["arg1type","arg2type",...]] |
btnClickHandler²»»á·µ»ØÈκÎÖµ£¬ËùÒÔÎÒÃǽ«typeÉèΪvoid£¬Ëü½ÓÊÕÒ»¸ö²ÎÊý£¬·¢ËͶÔÏó¡£ÔÚÕâÀォÊDZ»ÃüÃûΪbtnµÄNSButton¡£ÎÒÃÇʹÓá°id¡±ÀàÐÍÀ´Ö¸´úÈκζÔÏó¡£
typeÈ«²¿µÄÀàÐÍÁбí¿ÉÒԲ鿴release notes¡£
implementationÊÇÒ»¸öÆÕͨµÄº¯Êý¡£ÔÚÀïÃæÄã¿ÉÒÔÖ±½ÓдJavascript¡£ºÍ$ bridgeÒ»Ñù£¬ÀàµÄÄÚ²¿´úÂë¶ÔÍⲿÓÐͬÑùµÄ¿É·ÃÎÊÐÔ£¬±ÈÈçÄãÔÚÀàÍⲿÉèÖõıäÁ¿¡£
ʹÓýӿÚ
ÄãÄÜÓÃsubclassÀ´ÊµÏÖÒÑÓеÄCocoa½Ó¿Ú£¬µ«ÕâÀïÓÐÒ»¸öÏÝÚå¡£ÎÒ·¢ÏÖÈç¹ûÄãʹÓÃprotocolsÊý×éÄãµÄ½Å±¾½«»áÍ£Ö¹ÏìÓ¦²¢ÇÒûÓдíÎóÈÕÖ¾¡£Èç¹ûÄãÏÝÈëÁËͬÑùµÄ×´¿ö£¬ÎÒдÁËÒ»¸öʾÀýºÍ½âÊÍÒÔ¹©²é¿´¡£
Ñ¡Ôñ²¢ÇÒÏÔʾͼƬ
ÏÖÔÚÎÒÃÇ×¼±¸ºÃ´ò¿ªÃæ°å£¬Ñ¡ÔñͼƬ£¬²¢ÇÒÔÚ´°¿ÚÏÔʾËüÁË¡£Ê¹ÓÃÏÂÃæµÄ´úÂëÌæ»»btnClickHandlerµÄimplementationº¯Êý£º
...implementation:function(sender){ varpanel=$.NSOpenPanel.openPanel; panel.title="ChooseanImage";
varallowedTypes=["jpg","png","gif"];
//NOTE:WebridgetheJSarraytoanNSArrayhere.panel.allowedFileTypes=$(allowedTypes);
if(panel.runModal==$.NSOKButton){
//NOTE:panel.URLsisanNSArraynotaJSarrayvarimagePath=panel.URLs.objectAtIndex(0).path;
textField.stringValue=imagePath;
varimg=$.NSImage.alloc.initByReferencingFile(imagePath);
varimgView=$.NSImageView.alloc.initWithFrame(
$.NSMakeRect(0,windowHeight,img.size.width,img.size.height));
window.setFrameDisplay(
$.NSMakeRect(
0,0,
(img.size.width>minWidth)?img.size.width:minWidth,
((img.size.height>minHeight)?img.size.height:minHeight)+ctrlsHeight),
true
);
imgView.setImage(img);
window.contentView.addSubview(imgView);
window.center;
}} |
ÎÒÃÇ×öµÄµÚÒ»¼þÊÂÊÇ´´½¨ÁËÒ»¸öNSOpenPanelµÄʾÀý£¬ÕâÀïµÄpanelÃæ°å¾ÍÊÇÑ¡ÔñÎļþºÍ±£´æÎļþʱ´ò¿ªµÄ´°¿Ú¡£
ÎÒÃÇÖ»ÏëÈóÌÐò´ò¿ªÍ¼Æ¬¡£ÉèÖÃallowedFileTypes¿ÉÒÔÈÃÎÒÃÇÏÞ¶¨ÎļþÀàÐÍ¡£ËüÐèÒª½ÓÊÜÒ»¸öNSArrayÊý×é¡£ÎÒÃÇ´´½¨ÁËÒ»¸ö°üº¬allowedTypesµÄJSÊý×飬µ«»¹ÐèÒª½«Ëüת»»µ½NSArray¡£Ê¹ÓÃ$(allowedTypes)¿ÉÒÔÍê³Éת»»¡£ÕâÊÇbridgeµÄÁíÒ»ÖÖÓ÷¨¡£Í¨¹ýÕâÖÖ·½·¨ÎÒÃÇ¿ÉÒÔ½«JS´«µ½Objective-CÀÈç¹ûÒª´«ËÍObjective-Cµ½JSÄã¿ÉÒÔÓÃ$(ObjcThing).js¡£
´ò¿ªÃæ°åʹÓõÄÊÇpanel.runModal¡£Õ⽫ÔÝÍ£´úÂëµÄÖ´ÐС£µ±Äãµã»÷Cancel»òOpen£¬Ãæ°å»á·µ»ØÒ»¸öÖµ¡£Èç¹ûµã»÷µÄÊÇOpen£¬½«»á·µ»Ø$.NSOKButtonµÄÖµ¡£
ÁíÒ»¸ö¹Ø¼üÊÇpanel.URLs¡£ÔÚJSÀÎÒÃǶÁÈ¡Êý×éµÄµÚÒ»¸öÖµµÄ·½·¨ÊÇarray[0]£¬ÒòΪURLsÊÇÒ»¸öNSArray£¬ËùÒÔ²»ÄÜʹÓ÷½À¨ºÅ£¬¶øÓÃobjectAtIndex·½·¨À´´úÌæ¡£ËüÃǵĽá¹ûÊÇÒ»ÑùµÄ¡£
µ±ÎÒÃÇ»ñÈ¡µ½Ò»¸öͼƬµÄURLµÄʱºòÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸öеÄNSImage¶ÔÏó¡£ÓÉÓÚ´ÓÎļþURL»ñȡͼƬ·Ç³£ÆÕ±é£¬ËùÒÔΪ´ËÁ˶¨ÒåÁËÒ»¸ö·½±ãµÄ·½·¨£º
ÎÒÃÇ´´½¨ÁËÒ»¸öNSImageView£¬Ê¹Óõķ½·¨ºÍ´´½¨ÆäËûUIÔªËØÒ»Ñù¡£imgView¸ºÔðÏÔʾͼƬ¡£
ÎÒÃÇ»¹ÏëÈô°¿ÚµÄ³ß´çÆ¥ÅäͼƬµÄ³ß´ç£¬Í¬Ê±ÎÒÃÇ»¹ÐèҪȷ¶¨Ò»¸ö×îСµÄ³ß´çÀ´ÏÔʾ¿Ø¼þ¡£ÎÒÃÇʹÓÃsetFrameDisplayÀ´¸Ä±ä´°¿ÚµÄ´óС¡£
È»ºóÎÒÃÇͨ¹ýÉèÖÃImage viewͼƬ²¢½«ÆäÌí¼Óµ½´°¿Ú£¬ÒòΪËüµÄ³ß´çÒѾ±äÁËÎÒÃÇÐèÒªÖØÐ¶¨Î»´°¿Ú¡£
µ½ÕâÀï³ÌÐòÒѾÍê³ÉÁË¡£Äã¿ÉÒÔ´Ö±©µÄ²âÊÔËü£¬´ò¿ªÒ»¶ÑͼƬ£¬gif¶¯Í¼Ò²ÊÇÖ§³ÖµÄ£¬ËùÒÔ±ðÍüÁË´ò¿ªÒ»Ð©¡£
»¨Ðõ
ĿǰΪֹ£¬ÎÒÃÇÒ»Ö±´ÓScript EditorÀ´ÔËÐгÌÐò£¬µ«Ë«»÷´ò¿ª³ÌÐòÊÇͬÑùµÄÖ§³ÖµÄ¡£

Ë«»÷ͼ±êÒÔ´ò¿ª³ÌÐò
Äã¿ÉÒÔͨ¹ýÌæ»»/Contents/Resources/applet.icnsÀ´¸üгÌÐòͼ±ê£¬ÓÒ»÷³ÌÐòͼ±ê²¢Ñ¡Ôñ¡°Show
Package Contents¡±À´²é¿´³ÌÐò×ÊÔ´¡£
ΪʲôÎҸе½¼¤¶¯
ÎҺܼ¤¶¯ÊÇÒòΪÎÒÈÏΪËüÓкܴóµÄDZÁ¦¡£ÕâÀïÊÇÎÒµÄһЩÏë·¨£ºÒ»µ©YosemiteÕýʽ·¢²¼£¬Èκΰ²×°ÁËÕâ¸öϵͳµÄÈ˶¼½«ÄÜʹÓÃ×îÁ÷ÐеijÌÐòÓïÑÔÀ´±àдÔÉúµÄ³ÌÐò¡£ËûÃDz»ÐèÒªÏÂÔØ»ò°²×°ÈÎºÎÆäËû¶«Î÷£¨±ÈÈçJ*vaµÄÔËÐÐʱ£©¾ÍÄÜÔËÐÐÕâЩ³ÌÐò¡£ÄãÉõÖÁûÓбØÒªÏÂÔØXcode¡£Õ⽫´ó´ó½µµÍ²ÎÓëµÄÃż÷£¬Î´À´½«ÊÇÄÑÒÔÖÃÐŵġ£
ÎÒÖªµÀÓëÔËÐÐÒ»¶Î½Å±¾Ïà±È£¬»¹ÓкܶàÖÖ´´½¨OS X³ÌÐòµÄ·½·¨¡£ÎÒÒ²²»»á»ÃÏëJavascript±àдµÄ³ÌÐò³ÉΪMacÉϵÄÊ×Ñ¡¡£µ«ÎÒÈÏΪÕ⽫ÔÊÐí³ÌÐòÔ±¿ª·¢Ò»Ð©ÈÃ×Ô¼ººÍÆäËûÈ˹¤×÷¸üÇáËɵÄС³ÌÐò¡£Èç¹ûÒ»¸öÍŶӳÉÔ±²»Ï°¹ßʹÓÃÃüÁîÐУ¬¿ÉÒÔ¿ìËÙΪËû´´½¨Ò»¸öGUI½çÃæ£»ÐèÒª¿ìËٵġ¢¿ÉÊÓ»¯µÄ·½·¨À´´´½¨²¢¸üо޴óµÄÅäÖÃÎļþ£¿À´Ð´Ò»¸öС³ÌÐò°É¡£
ÆäʵÆäËûµÄÓïÑÔÒ²ÓÐÕâÑùµÄÄÜÁ¦£¬PythonºÍRubyͬÑùÒ²ÄܶÁÈ¡ÏàͬµÄAPI£¬ÒÔ¼°±àдС³ÌÐò¡£µ«Äܹ»Ê¹ÓÃJavascriptÈÃÈ˸оõµ½ÊÂÇé²»Ò»ÑùÁË¡£ËüÊǵ߸²ÐԵģ¬Ëü¾ÍÏñÊdzäÂú´´ÔìÁ¦µÄWebÇÃÏìÁË×ÀÃæµÄ´óÃÅ¡£Æ»¹û³¨¿ªÁË´óÃÅ£¬ÎÞÐèÑûÇ룬ÎÒ½«×Ô¼º½øÈ¥¡£
|