Eine Statusbar-App für Mac OS X mittels Mono und Xamarin Studio entwickeln

Bei Mac OS X befindet sich oben am Bildschirmrand die Menü- und Statusbar. In diesem Artikel soll es darum gehen, eine solche Statusbar-App in Mono mittels des Xamarin Studios zu erstellen. Im ersten Schritt wird dazu ein neues MonoMac-Projekt im Xamarin-Studio angelegt. Wenn man dieses Projekt startet, findet man ein leeres Mac OS X-Fenster vor.

Ein neues MonoMac Projekt wird angelegt

Ein neues MonoMac Projekt wird angelegt

In dem neu angelegten Projekt wird eine neue Klasse mit dem Namen AppController angelegt. Diese wird mit folgendem Inhalt gefüllt:

using System;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace StatusBarApp
{
    [Register("AppController")]
    public partial class AppController : NSObject
    {
        public AppController()
        {
        }

        public override void AwakeFromNib()
        {
            var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
            statusItem.Menu = statusMenu;
            statusItem.Image = NSImage.ImageNamed("status");
            statusItem.HighlightMode = true;

            mcQuit.Activated+=(object sender, EventArgs e) =>
            {
                NSApplication.SharedApplication.Terminate(this);
            };
        }
    }
}

Damit die Anwendung kein Menü und kein Dock-Icon mehr besitzt, müssen wir die Info.plist bearbeiten. In dieser Datei muss ein neuer Schlüssel mit dem Namen Application is agent (UIElement) und dem Typ Boolean angelegt werden. Der Wert des neuen Schlüssels wird dabei auf YES gesetzt.

Der neue Schlüssel wird mit dem PList-Editor des Xamarin Studios hinzugefügt

Der neue Schlüssel wird mit dem PList-Editor des Xamarin Studios hinzugefügt

Nun öffnen wir die Datei MainMenu.xib, welche von Xamarin Studio in Xcode geöffnet wird. Hier ziehen wir ein neues Objekt vom Typ Menu in den Designer und entfernen alle Einträge bis auf einen. Dem verbliebenen Eintrag geben wir die Beschriftung Quit. Anschließend fügen wir ein Object hinzu und begeben uns in den Identity Inspector. Dort tragen wir bei Custom Class unter Class den Namen AppController ein. Das vorhandene Hauptmenü kann anschließend entfernt werden.

Das Design unter Xcode

Das Design unter Xcode

Nun muss das Menü mit dem Quellcode verbunden werden, dazu wird der Assistance Editor in Xcode geöffnet. Als Quelltext wird auf der rechten Seite des Editors die Datei AppController.h ausgewählt. Nun wird das Menü mittels gedrückter Steuerungstaste (Strg/Ctrl) in die Headerdatei gezogen. Damit legen wir ein Outlet an. Dieses bekommt den Namen statusMenu. Das gleiche wird anschließend mit dem Menüeintrag Quit gemacht. In diesem Fall wird dabei eine Action definiert, welche den Namen mcQuit bekommt. Nun kann Xcode wieder geschlossen werden.

Dem Projekt muss nun noch eine 29×22 Pixel große Grafik hinzugefügt werden. Die Grafik (in diesem Fall status.png) wird beim Laden als Icon für die Statusleiste genutzt. Als letzten Schritt können die Dateien MainWindow.cs, MainWindow.xib und MainWindowController.cs entfernt werden. Nachdem diese Objekte auch im AppDelegate entfernt wurden, ist die Anwendung fertig. Der Quelltext des Projektes kann sich auch heruntergeladen werden. Er kann dabei von jedermann frei verwendet (Public Domain) werden.

Cocoa Controls

Wenn man in Xcode eine iOS oder Mac OS X App schreibt, so ist manchmal auf bestimmte Controls angewiesen, welche nicht in den Standard BIbliotheken zu finden sind. Abhilfe schaffen hier sogenannte „Custom Controls“, welche überall im Netz zu finden sind.

cocoacontrols.com

cocoacontrols.com

Eine zentrale Anlaufstelle für solche Controls bietet dabei die Seite cocoacontrols.com. Dort sind die Controls nach Lizenzen, Betriebsystem und einigen anderen Kategorieren sortiert, so das man meist relativ schnell das passende Control findet.

iOS App unter Xcode umbennnen

Manche Sachen sind relativ einfach, wenn man weiß wo man suchen muss. Eine dieser Sachen ist das umbenennen von iOS Apps unter Xcode. Um dies zu bewerkstelligen sollte man zuerst auf das entsprechende „Target“ in den Projekteinstellungen klicken. Dort sucht man in den „Build Settings“ nach dem „Product Name“ (welcher sich in der Sektion „Packaging“ versteckt):

Die entsprechende Projekteinstellung in Xcode

Dort ändert man den Namen entsprechend seinen Wünschen. Anschließend trägt das Kompilat den neuen Namen. Eine alternative Variante (bei einem an vorheriger Stelle unverändertem Projekt) ist die Umbenennung des entsprechenden „Targets“ durch einen Doppelklick auf selbiges.

Einem iOS Xcode Projekt eine Bibliothek hinzufügen

Es gibt die einfache Art und die nicht ganz so einfache Art. So ist es zum Beispiel unter C# ziemlich einfach eine Bibliothek zu einem Projekt hinzuzufügen und diese anschließend zu benutzen. Also was liegt näher als das gleiche unter Objective C mittels Xcode zu versuchen.

Und dort merkt man dann das Objective C ein Superset von C ist. Es ist leider nicht ganz so einfach wie man es sich wünscht. Aber fangen wir von vorne an. Gegeben seien zwei Projekte:

  • Taschenrechner (iOS App)
  • LibCore (Cocoa Touch Bibliothek)

Die Bibliothek „LibCore“ soll dabei dem Projekt „Taschenrechner“ hinzugefügt werden, damit man dieses die entsprechenden Funktionen nutzen kann. Unter Objective C gibt es Frameworks und Bibliotheken. Frameworks können auf den iOS Geräten nicht benutzt werden, damit bleiben nur noch statische Bibliotheken.

Die Einstellungen für die Suchpfade

Im ersten Schritt müssen im Projekt die Suchpfade definiert werden. Dazu gehen wir in die Projekteinstellungen in den Punkt „Build Settings“ und suchen dort nach „Header“. Die Suche wird dann den Punkt „Header Search Paths“ finden. Dort tragen wir den Pfad zur entsprechenden Bibliothek ein.

Nun werden Headerdateien welche mittels:

#import "LibCore.h";

eingebunden werden vom Compiler gefunden. Beim Linker kommt es allerdings noch zu Fehlern. Deshalb ziehen wir das Projekt (die „LibCore.xcodeprj“) auf unserer Taschenrechnerprojekt. Dadurch ist dieses Projekt nun ein „Unterprojekt“ von Taschenrechner. In den Projekteinstellungen suchen wir nun den Tab „Build Phases“ auf „Link Binary With Libraries“ und fügen dort die „LibCore.a“ hinzu.

Die Bibliothek wird dem Linker bekannt gemacht

Danach sollte das Projekt mit der Bibliothek ohne Probleme kompilieren.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Xcode
http://de.wikipedia.org/wiki/Objective_C