18 Stimmen

Zugriff auf Methode aus anderen Klassen Objective-C

Ich habe nach einer Antwort auf diese Frage gesucht, aber noch keine passende gefunden. Ich hoffe, ihr könnt mir weiterhelfen! (Dies ist für eine iPhone-App)

Also gut, ich habe eine Mutliview-Anwendung. Jede Ansicht hat ihre eigene Klasse, und alles ist gut. Allerdings rufen die verschiedenen Klassen manchmal die gleiche Methode auf. Bis jetzt habe ich diese Methode einfach zweimal geschrieben, in beiden Klassendateien.

Das ist es, was ich tun möchte:

Ich möchte eine neue Klasse in einer eigenen Datei erstellen, die alle "gemeinsamen" Methoden enthält. Wenn dann eine andere Klasse die Methode aufrufen muss, rufe ich sie einfach aus der anderen Datei auf. Auf diese Weise, wenn ich die Methode ändern möchte, brauche ich sie nur an einer Stelle zu ändern, und nicht an allen Stellen...

Ich bin mir nicht sicher, wie ich das machen soll, deshalb bitte ich um Hilfe. Ich bin ein wenig eingerostet und neu in Objective-C, also werden mir schöne Beispiele sehr helfen. Erlauben Sie mir, Ihnen eines zu geben.

Datei: ViewController1.m

@implementation ViewController1

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

Datei: ViewController2.m

@implementation ViewController2

//Do Some awesome stuff....

CALL "CommonMethod" HERE

@end

Datei: CommonClass

@implementation commonClass

- (void)CommonMethod:(id)sender
{

//So some awesome generic stuff...

    }
@end

Ich glaube, ich muss die andere Datei #importieren, ein Objekt aus der Klasse erstellen und die Methode aus dem Objekt aufrufen... Wie kann ich das tun?

Nochmals vielen Dank!

26voto

Nir Levy Punkte 4324

Option 1:

@implementation commonClass
+ (void)CommonMethod:(id)sender  /* note the + sign */
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    [commonClass CommonMethod];
}

@end

Option 2:

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    commonClass *c=[[commonClass alloc] init];
    [c CommonMethod];
    [c release];
}

@end

Option 3: Vererbung verwenden (siehe die Beschreibung von Herrn Totland in diesem Thread)

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

/* in your .h file */
@interface ViewController2: commonClass

@end

Natürlich müssen Sie immer #import commonClass.h in Ihren Sichtkontrollen.

0 Stimmen

Hallo, was ist die Superklasse von commonClass hier? Ich meine, ich habe eine Methode, die ich brauche, um von vielen verschiedenen Klassen aufrufen, so was wird die beste Praxis für sie sein?

0 Stimmen

Ist [property release] im ARC-Modus erlaubt? Compiler sagt mir, es ist nicht erlaubt.

0 Stimmen

@tymac Dieser Beitrag stammt aus dem Jahr 2009, vor ARC.

6voto

bpapa Punkte 21253

Es gibt hier einige Antworten, die Ihnen raten, eine gemeinsame "übergeordnete" Klasse zu erstellen. Ich denke jedoch, dass Sie es viel besser machen können. Erstellen Sie eine Kategorie für UIViewController statt. Sie wissen nicht, alle der Interna, was los ist mit UIViewController, so dass ich nicht denke, es lohnt sich die Erstellung Ihrer eigenen View-Controller-Hierarchie aus. Das könnte sogar gefährlich sein. Ich bin auf eine Reihe von Problemen gestoßen, als ich versucht habe, einen "Basis"-UITableViewController zu erstellen und dann Klassen zu erstellen, die von diesem erben. Ich habe diese Probleme vermieden, indem ich stattdessen Kategorien verwendet habe.

Ihre oberste Priorität sollte nicht sein, Dinge ohne guten Grund zu erben, sondern eine App in den App Store zu bringen, die die Leute herunterladen wollen.

3voto

Carl Norum Punkte 210051

Für mich klingt es so, als ob der gemeinsame Code überhaupt nicht in einer Klasse sein muss. Gibt es einen Grund, warum Sie nicht einfach eine Funktion im C-Stil für das, was Sie tun möchten, verwenden können?

Sie könnten den gemeinsamen Code in einer Klasse unterbringen und dann Ihre beiden anderen Klassen zu Unterklassen dieser Klasse machen; diese Methode vermeidet auch die Verdoppelung des Codes.

Eine andere Möglichkeit wäre, eine Klassenmethode anstelle von Instanzmethoden für diesen allgemeinen Code zu schreiben. Ich denke, dass die meisten Leute der Meinung sind, dass Singletons am besten vermieden werden sollten, wenn es um das Design geht.

Es wäre einfacher, eine gute Antwort zu geben, wenn wir mehr darüber wüssten, was Sie wirklich zu erreichen versuchen.

0 Stimmen

Es scheint ein Problem zu sein, dass die Vererbung nicht genutzt wird.

0 Stimmen

Ich danke Ihnen. Ich hatte eine Methode (method1) in Klasse1. Ich habe sie in Class1.h deklariert und in Class1.m implementiert. Ich habe Class2 und sie hat einen Selektor:@selector(method1). Wie kann ich das in diesem Fall tun?

1 Stimmen

@Williham, so hört es sich auch an. @srikanth, vielleicht sollten Sie eine Frage stellen, anstatt hier nur einen Kommentar zu posten?

3voto

Williham Totland Punkte 27585

Was Sie tun wollen, ist, dass die beiden Controller eine gemeinsame Oberklasse haben:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2

commonMethod: würde sich dann in MyAwesomeViewController befinden. Außerdem sollten Sie Methodennamen nicht mit Großbuchstaben beginnen :)

Um das zu erläutern:

+@interface MyAwesomeController : UIViewController {

-@interface ViewController1 : UIViewController { // and ditto for ViewController2
+@interface ViewController1 : MyAwesomeController {

1voto

AlBlue Punkte 21966

Denken Sie daran, dass Objective-C nur eine Obermenge von C ist, und dass #include-Direktiven zwar meist für Header-Dateien verwendet werden, Sie aber nichts daran hindert, den Inhalt einer Implementierung in eine andere einzubetten. Wenn der Code wirklich identisch ist, können Sie ihn einfach in eine eigene Datei packen und #include in die .m-Datei einfügen.

Allerdings wäre es vielleicht besser, diese Technik in Verbindung mit Kategorien zu verwenden, insbesondere wenn dieselbe Implementierung ähnliche Verhaltensweisen aufweist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X