2009-11-01 11 views
19

Busqué una respuesta para esta pregunta, pero todavía no he encontrado la adecuada. ¡Espero que ustedes (y chicas) puedan ayudarme! (Esto es para una aplicación de iPhone)Método de acceso de otras clases Objetivo-C

Muy bien, tengo una aplicación de Mutliview. Cada vista tiene su propia clase, y todo está feliz. Sin embargo, las diferentes clases a veces llaman al mismo método. Hasta ahora, simplemente escribí ese Método dos veces, en los dos archivos de clase.

Esto es lo que quiero hacer sin embargo:

Quiero hacer una nueva clase, en su propio archivo, que tiene todos los métodos "común". Entonces, cada vez que otra clase necesite llamar al Método, simplemente lo llamo desde el otro archivo. De esta manera, cuando quiero cambiar el Método, solo necesito cambiarlo en un solo lugar, y no en todos los lugares ...

No estoy seguro de cómo haría esto, por eso es que ' Estoy pidiendo ayuda. Estoy un poco oxidado y nuevo para Objective-C, por lo que los ejemplos bonitos me ayudarán mucho. Permíteme darte uno.

del archivo: ViewController1.m

@implementation ViewController1 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

del archivo: ViewController2.m

@implementation ViewController2 

//Do Some awesome stuff.... 

CALL "CommonMethod" HERE 

@end 

del archivo: CommonClass

@implementation commonClass 

- (void)CommonMethod:(id)sender 
{ 

//So some awesome generic stuff... 



    } 
@end 

Siento que tengo que import el otro archivo, crea un Objeto de la clase y llama al Método desde el Objeto ... ¿Cómo hago eso?

¡Gracias nuevamente!

Respuesta

26

Opción 1:

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

@implementation ViewController2 

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


@end 

Opción 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 

Opción 3: utilizar la herencia (véase la descripción del Sr. Totland en este hilo)

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

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

@end 

naturalmente siempre se necesita a #import commonClass.h en sus controladores de vista ..

+0

Hola, ¿cuál es la clase superior de commonClass aquí? Quiero decir que tengo un método que debo llamar de muchas clases diferentes, entonces, ¿cuál será la mejor práctica para ello? –

+0

¿Se permite '[release de propiedad]' en modo ARC? El compilador me dice que no está permitido. – tymac

+0

@tymac Esta publicación es de 2009, antes de ARC. –

3

Me parece que el código común no necesita estar en una clase en absoluto. ¿Hay alguna razón por la que no puedas usar una función de estilo C para lo que quieres hacer?

Puede poner el código común en una clase y luego hacer las otras dos clases de subclases de esa clase; este método también evita la duplicación de código.

Otra opción podría ser escribir un método de clase en lugar de métodos de instancia para este código común. Creo que la mayoría de la gente cree que lo mejor es evitar los singleton como opción de diseño.

Sería más fácil dar una buena respuesta si supiéramos más acerca de lo que realmente estaba tratando de lograr.

+0

Parece ser un problema de no aprovechar la herencia. –

+0

Gracias. Tenía un método (method1) en Class1. Lo declare en Class1.h e implementado en Class1.m. Tengo Class2 y tiene un selector: @selector (method1). En este caso, ¿cómo puedo hacerlo? –

+1

@Williham, así es como suena. @srikanth, ¿quizás necesites hacer una pregunta en lugar de solo publicar un comentario aquí? –

3

Lo que se quiere hacer es hacer las dos controladores comparten una superclase común:

UIViewController : MyAwesomeViewController : ViewController1 
              : ViewController2 

commonMethod: entonces residir en MyAwesomeViewController. Además, no inicie los nombres de los métodos con letras mayúsculas. :)

Elaborar:

[email protected] MyAwesomeController : UIViewController { 

[email protected] ViewController1 : UIViewController { // and ditto for ViewController2 
[email protected] ViewController1 : MyAwesomeController { 
+0

+1 herencia es el camino a seguir. –

1

tener en cuenta que Objective-C es un superconjunto de C, y que mientras directivas # include se utilizan sobre todo para los archivos de cabecera, no hay nada que le para el uso de un # incluir para incrustar los contenidos de una implementación dentro de otra implementación. Si el código es realmente idéntico, puede simplemente pegarlo en su propio archivo, y #incluirlo en el archivo .m.

Dicho esto, tal vez sería mejor utilizar esta técnica junto con las categorías, especialmente si la misma implementación tiene comportamientos similares.

1

pasa una referencia a su commonClass cuando alloc e init sus puntos de vista ...

CommonClass *cc = [[CommonClass alloc] init]; 

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc]; 
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc]; 

pero haciendo un clásico C incluyen podría bastar.

6

Aquí hay algunas respuestas que le dicen que cree una clase común de "padres". Sin embargo, creo que puedes hacerlo mucho mejor. Cree un category para UIViewController en su lugar. No conoce todos los aspectos internos de lo que está sucediendo con UIViewController, por lo que no creo que valga la pena crear su propia jerarquía de View Controller. De hecho, podría ser peligroso. Me encontré con una serie de problemas cuando traté de crear un UITableViewController "base" y luego crear clases que heredan de eso. Evité estos problemas usando categorías en su lugar.

Su prioridad # 1 no debe heredar cosas sin una buena razón, debería ser obtener una aplicación en la tienda de aplicaciones que la gente quiera descargar.

+0

+1 para el para ... –

0

Como neófito de iPhone con fondo Java y poca C, tuve un problema similar al querer referirme a un método tanto en RootController como en ViewController. Me pareció que el lugar apropiado para el método era la clase AppDelegate, una instancia de la que se obtiene en otras clases por:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

entonces si el método es "doSomething" uno accede a ella por:

[delegate doSomething]; 

Pero quizás esto es demasiado obvio o no lo que se requería.

0

Otro método que se puede utilizar

@interface ServerManager : NSObject 

+(ServerManager *)getInstance; 

@implementation ServerManager 

+(ServerManager *)getInstance 
{ 
static ServerManager *objServerManager = nil; 

if(objServerManager==NULL){ 
objServerManager=[[self alloc] init]; 
} 
// Return the servermanager object. 
return objServerManager; 
} 

de llamadas Si desea utilizar

ServerManager *SMObject = [ServerManager getInstance]; 

No se olvide de importar el archivo servermanager.h.

Cuestiones relacionadas