Programmeinstellungen organisieren?

michael m.

Aktives Mitglied
Thread Starter
Dabei seit
29.12.2006
Beiträge
407
Reaktionspunkte
6
Hallo,
ich tue mich ein bisschen schwer Programmvariablen zu definieren.
Diese Inhalte dieser Variablen nutzt man in allen Klassen und Controller des Projektes. Entweder übergebe ich ständig das Objekt mit den Programmvariablen oder über globale Variablen. Habe aber oft gelesen, daß das verwenden von globalen Variablen kein guter Programmierstil ist. Dann frage ich mal wie das normalerweise organisiert wird.
Danke
Michael
 
Da gibt es verschiedene Strategien.

Du kannst dir selbst ein sogenanntes Singleton Objekt bauen (welches es dann nur einmal gibt).

Oder du nutzt z.B. die AppDelegate Klasse dafür, die ist ja sowieso immer da. Darauf kannst du mit Objective-C mit

Code:
[[UIApplication sharedApplication] delegate]

zugreifen.

Speziell für Benutzereinstellungen gibt es noch NSUserDefaults. Die haben den Vorteil, dass die Persistierung (also z.B. speichern der Daten in ~/Library/Preferences) gleich für dich mit übernommen wird.
 
  • Gefällt mir
Reaktionen: michael m.
Danke Dir.
Die NSUserDefaults habe ich bereits eingebaut und funktioniert gut.
Da ich aber nun die starren Pfade jetzt dynamisch gestalten wollte, kam das Problem wie ich die Ausgewählten Pfade für alle Klassen zugänglich machen kann.

Ich Google mal nach Singleton Objekt und probiere auch mal die Möglichkeit mit der AppDelegate.
 
Hallo,

Du brauchst doch nur eine Klasse "MyPreferences" erstellen.
Dann erzeugst Du eine Instanz davon mit [[MyPreferences alloc] init] und reichst die Instanz weiter.
Dann implementierst Du einfach eine -read und -write Methode.

Die Sache mit dem Singleton ist eine Möglichkeit, aber ist aus Sicht der Programmierung sehr verpönt - berechtigt…

Viele Grüße
 
@little_pixel

Ich habe eine Klasse "Einstellungen" mit den entsprechenden Accessor-Methoden.
Wenn ich die Objektinstanz in der Klasse AppDelegate.m unter "applicationDidFinishLaunching" erstelle, weis ich nicht wie diese an eine andere Klasse "ImportController" übergeben soll, die auf ein IBAction reagiert.

Ich habe schon Methoden und Funktionen geschrieben in denen Werte und Objekte übergeben wurden, aber hier weis ich nicht wie das gehen soll?
Vielleicht ist das ziemlich banal oder ich sitze schon zu lange vor der Kiste :)
 
Die Instanzen, die mit Einstellungen interagieren, schreibst Du einfach eine entsprechende init-Methode.
Also -initWithPreference: und darin sicherst Du die Preference-Instanz in einer Eigenschaft.

Viele Grüße
 
Hä? Hab ich was verpasst? Das musst Du bitte mal näher erläutern.

Muss ich nicht… ;-)
Ich führe nämlich keine Kreisgespräche.

Bitte melde Dich bei osxentwicklerforum.de an und erörtere da die Themataik "Singleton".
Gerne verfolge ich da Deine Argumentation mit.

Viele Grüße
 
Huuu? Hab da mal kurz durchgeguckt - da sind ja wirklich ein paar Spezialisten unterwegs.

Gut gefallen hat mir z.B. der hier:

"Ich sehe jetzt nicht, wo in Deinem Beispiel die Notwendigkeit für ein Singleton besteht.
Eine Instanzvariable des App Delegate funktioniert doch genau so gut.
"

:crack:
 
Ich habe jetzt mal versucht das mit der Klasse um zu setzten, habe im Netz und in Büchern noch mal nachgelesen, aber ich habe das Gefühl das ich dafür zu blöd bin. In anderen Klassen kann ich nicht auf die Variablen zugreifen.

Den Weg habe ich anscheinend noch nicht verstanden!?
 
Hallo Michael,

in der Klasse MyPreferences implementierst Du entsprechende Methoden.
-setMyPreferenceValue:, -myPreferenceValue, -isMyPreferenceValue etc.

D.h. Du greifst eben nicht auf die "internen Variablen" direkt zu, sondern nutzt die nach aussen hin bekannten Methoden.

Viele Grüße
 
Ja das ist mir bekannt, das sind die sogenannten Getter -und Settermethoden.
In Java habe ich richtige Methoden mit mehreren Zeilen Code geschrieben, in Objective-C aber über Properties und Synthesize.

Wenn ich jetzt in der Klasse ImportController ein Objekt von PREFERENCES erstelle, dann lebt es in dieser Klasse das ist für mich ja soweit verständlich, aber wie ist es dann wenn ich in einer anderen Klasse auf die Inhaltes dieses Objektes zugreifen möchte? Ich weis nicht wie ich es dann dahin bekommen soll. Ist ja nicht so das ich sagen kann ich schiebe das Objekt jetzt in eine andere Klasse. Oder doch?

Was ich mir auch vorstellen kann, was ich aber nicht weis, wenn ich in der anderen Klasse das Objekt von der Klasse wo es erzeugt wurde, abholen kann?

Viele Grüße
Michael
 
Das habe ich vorne beschrieben. Du übergibst die Instanz z.B. bei dem -init…

Viele Grüße
 
Ich habe jetzt lange im Netz nach Beispielen gesucht, in meinen verfügbaren Bücher habe ich dazu nichts gefunden und habe mal anhand von Beispielen versucht das ganze zu verstehen.

Ziel:
Klasse >Einstellungen< für globale Variablen und Methoden
Klasse >AppDelegate< sollten die Variablen initialisiert werden
Klasse >ImportController< sollte die Variablen ausgegeben werden

Hier habe ich mal etwas code der nicht funktioniert.
Ich habe mir dann noch mal die Kapitel Klassen und Variablen nachgelesen.
Entweder ist das Kapitel mit den Globalen Variablen nicht üblich und schwer zu verstehen.

Dann habe ich das ganze ein bisschen vor mir her geschoben, komme mir vor als wäre ich zu blöde dafür!!!

Code:
//
//  Einstellungen.h
//

#import <Foundation/Foundation.h>

@interface Einstellungen : NSObject {
    NSString *dateiName;
}

@property (nonatomic, retain) NSString *dateiName;

+(Einstellungen *)globaleEinstellungen;

@end

Code:
//
//  Einstellungen.m
//

#import "Einstellungen.h"

@implementation Einstellungen

@synthesize dateiName = _dateiName;

+(Einstellungen *)globaleEinstellungen {
    // ??
    static dispatch_once_t onceToken;
    // Erzeugt ein leeres statisches Objekt
    static Einstellungen *instanz = nil;
    // ??
    dispatch_once(&onceToken, ^{
        instanz = [[Einstellungen alloc] init];
    });
    return instanz;
} // Ende globaleEinstellungen

- (id)init {
    self = [super init];
    if (self) {
        _dateiName = [[NSString alloc] init];
    }
    return self;
}

@end

Code:
//
//  AppDelegate.m
//

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
    
    Einstellungen *globaleVariaben = [Einstellungen globaleEinstellungen];
    globaleEinstellungen.dateiName = @"DateiNameInDerVariable";
    

}

- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}

@end

Code:
//
//  ImportController.m
//

#import "ImportController.h"

@implementation ImportController

@synthesize textAusgabe;

- (IBAction)textButton:(id)sender {

    [textAusgabe setStringValue:[NSString stringWithFormat:@"%@",
                                 globaleVariablen.dateiName]];
}
@end
 
Zurück
Oben Unten