Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Informace
Programování na Macu - Aplikace pro kontrolu nové pošty (2)
7. prosince 2007, 09.00 | V minulém díle jsme založili nový projekt v Xcode a nakonfigurovali jej tak,
abychom mohli použít pro část kódu Javu. V tomto díle nejprve vyzkoušíme, jak
použití tříd napsaných v Javě funguje, a potom se vrátíme k uživatelskému
rozhraní a přidáme do lišty v pravém horním rohu svou ikonku a k ní menu.
Volání kódu v Javě
Zatím máme jen jednu prázdnou třídu v souboru Test.java. Otevřete tento soubor a přidejte do něj zvýrazněné řádky z následujícího výpisu:public class Test {
public void write(String msg) {
System.out.println(msg);
}
}
Přidaná metoda dostane jeden parametr typu String a vypíše jej na standardní výstup (v našem případě na konzolu Xcode).
Aby bylo možné třídu použít v Objective-C, musíme pro ni napsat rozhraní. Přidáme tedy soubor JavaInterfaces.h. Klikněte pravým tlačítkem na "Other Sources", vyberte "Add > New File..." a v okně položku "Empty File in Project". Do nového souboru nakopírujte tento kód:
@interface Test
{}
- (void)write:(NSString*)msg;
@end
Nyní bude při volání metody write z Objective-C jasné, jaké argumenty má dostat a jakého typu je návratová hodnota (resp. že metoda nic nevrací). Převod z typu NSString na javovský String probíhá automaticky, o to se starat nemusíme.
Teď otevřete soubor main.m a přidejte do něj zvýrazněné řádky:
#import <Cocoa/Cocoa.h>
#import "JavaInterfaces.h"
int main(int argc, char *argv[])
{
Test* test = NSJavaObjectNamedInPath(@"Test", nil);
[test write: @"Hello from Java"];
return NSApplicationMain(argc, (const char **) argv);
}
Po kliknutí na "Build and Go" se po kompilaci program spustí a v konzole byste měli vidět na posledním řádku text "Hello from Java". První řádek přidaného kódu vytvoří instanci třídy Test, druhý řádek zavolá její metodu write s jedním parametrem (v terminologii Objective-C bychom řekli, že jí předá zprávu). Jak již bylo uvedeno, argument typu NSString je před zavoláním metody převeden na typ v Javě, což se týká obecně všech základních typů a většiny tříd z frameworků Foundation a Application Kit (tj. tříd, jejichž jméno začíná prefixem NS).
Neděste se spousty varování v konzole. Ta se týkají správy paměti, konkrétně si systém stěžuje, že neexistuji žádný pool pro uvolňování paměti (autorelease pool). My budeme v budoucnu používat Javu až po inicializaci celé aplikace, kdy už bude k dispozici i korektní správa paměti.
Přidání ikonky a menu
A teď zpět k uživatelskému rozhraní.-
Klikněte dvakrát na položku MainMenu.nib. V Interface Builderu
vyberte v hlavním okně záložku "Classes", klikněte na "NSObject" a stiskněte
Enter. Tím jste vytvořili novou třídu, jejíž nadtřídou je NSObject,
kterou pojmenujte AppController.
- V menu "Classes" vyberte "Instantiate AppController". Tím vytvoříte instanci této třídy, ke které budete mít přístup z kódu v Objective-C.
- V menu "Classes" vyberte "Create Files for AppController". Tento příkaz vygeneruje soubory AppController.h a AppController.m a přidá je do projektu.
- Vraťte se do Xcode a upravte soubory AppController.h a AppController.m.
// AppController.h
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject
{
NSStatusItem* statusItem;
}
- (NSMenu*)createMenu;
@end
Zde jsme nadefinovali vlastnost třídy statusItem, reprezentující položku horní lišty, a metodu createMenu, jež vytvoří nabídku naší aplikace.
// AppController.m
#import "AppController.h"
@implementation AppController
- (void)awakeFromNib {
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength] retain];
[statusItem setHighlightMode: YES];
[statusItem setImage: [NSImage imageNamed: @"small"]];
[statusItem setMenu: [self createMenu]];
}
- (NSMenu*)createMenu {
NSMenu* menu = [[NSMenu alloc] initWithTitle: @"Email Notifier"];
NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: @"Info..." action: @selector(about) keyEquivalent: @""];
[item setTarget: self];
[menu addItem: item];
[menu addItem: [NSMenuItem separatorItem]];
item = [[NSMenuItem alloc] initWithTitle: @"Quit" action: @selector(exit) keyEquivalent: @""];
[item setTarget: self];
[menu addItem: item];
return menu;
}
- (void)dealloc {
[statusItem release];
[super dealloc];
}
- (void)about {
[NSApp activateIgnoringOtherApps: YES];
[NSApp orderFrontStandardAboutPanel: self];
}
- (void)exit {
[NSApp terminate: nil];
}
@end
U této třídy se na chvilku zastavíme. Přidali jsme několik metod, které si zaslouží vysvětlení. Začneme od těch jednodušších:
- Metoda exit ukončí aplikaci předáním zprávy terminate instanci NSApp.
- Metoda about zobrazí dialog o naší aplikaci (což je ekvivalentní kliknutí na položku "About..." ve standardním menu programu).
- Metoda dealloc uvolní paměť instance třídy AppController těsně před jejím zrušením.
- Metoda awakeFromNib je zavolána po nahrání celého .nib souboru do paměti a instanci třídy AppController. My ji využíváme k přidání ikonky do lišty a vytvoření menu. Aby se ikonka zobrazila, musíte ji přidat do projektu. Klikněte na záložku "Resources", vyberte "Add > Existing Files..." a určete soubor s obrázkem, který v liště bude reprezentovat vaši aplikaci. Soubor se musí jmenovat small, přípona závisí na typu souboru.
-
Metoda createMenu vytvoří objekt typu NSMenu s položkami
Info... a Quit. První položka vyvolá metodu about a
druhá metodu exit ve stejné třídě.
<key>NSUIElement</key>
<string>1</string>
To způsobí, že po spuštění aplikace se v docku nezobrazí její ikona ani hlavní menu, jak je pro tento typ programů obvyklé.
Kliknete-li nyní na "Build and Go", objeví se v horní liště ikonka s menu:
Obsah seriálu (více o seriálu):
- Programování na Macu - Aplikace pro kontrolu nové pošty (1)
- Programování na Macu - Aplikace pro kontrolu nové pošty (2)
- Programování na Macu - Aplikace pro kontrolu nové pošty (3)
- Programování na Macu - Aplikace pro kontrolu nové pošty (4)
- Programování na Macu - Aplikace pro kontrolu nové pošty (5)