webapp sizes pwa name medium icon for capable apple app iphone ipad ios

iphone - sizes - pwa ios medium



¿Cómo resuelvo esta dependencia circular? (3)

@class es el enfoque sintáctico que estás buscando.

Muchos programadores buscan evitar esta circularidad (que une sus clases en dos direcciones, lo que significa que su controlador de vista solo se puede usar en circunstancias en las que el delegado de la aplicación tiene esa BOOL). Hay algunas maneras de hacer esto:

  • Mueve la variable de estado a un singleton
  • Haga que el controlador de la vista obtenga el valor a través de una interfaz que el delegado implementa
  • Observación de valor-clave (que su delegado de aplicación configuraría en su controlador de vista)

Para proyectos pequeños, este tipo de dependencia probablemente no sea realmente un problema, pero a medida que aumenta el tamaño del proyecto y aumenta la conveniencia de la reutilización del código, la separación funcional limpia se vuelve más y más valiosa.

Soy nuevo en el desarrollo de iOS y tengo un problema con mis archivos de encabezado. Estoy teniendo un problema de dependencia circular con mis archivos de encabezado. Mi clase de delegado de aplicación contiene un puntero a mi controlador de vista, ya que tengo que configurar una de las propiedades del controlador de vista en mi método didFinishLaunchingWithOptions ...

//appDelegate.h //DISCLAIMER: THIS IS UNTESTED CODE AND WRITTEN ON THE FLY TO ILLUSTRATE MY POINT #import <UIKit/UIKit.h> #import "MyViewController.h" @interface appDelegate NSManagedObjectContext *managedObjectContext; MyViewController *viewController; BOOL myFlag; @end //appDelegate.m @implementation appDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { viewController.managedObjectContext = self.managedObjectContext; . . . } @end

Y en mi controlador de vista, hago referencia a la propiedad "myFlag", que está en mi delegado de aplicación ...

//MyViewController.h #import "appDelegate.h" //<---circular dependency, causing "Expected specifier-qualifier-list before MyViewController" errors in my appDelegate header file @interface MyViewController: UIViewController { NSManagedObjectContext *managedObjectContext; } @end //MyViewController.m @import "MyViewController.h" @implementation MyViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; ((appDelegate*)[[UIApplication sharedApplication] delegate]).myFlag = NO; } @end

Pero para acceder a la propiedad "myFlag" en mi delegado de aplicación, debo importar el archivo de encabezado del delegado de aplicación. Esto es lo que está causando la dependencia circular. No estoy seguro de cómo resolver esto, ¿alguien se ha topado con esto?

¡Gracias de antemano por tu ayuda!


No #import "MyViewController.h" en appDelegate.h . En cambio, declara la clase hacia adelante.

@class MyViewController; @interface appDelegate NSManagedObjectContext *managedObjectContext; MyViewController *viewController; BOOL myFlag; @end

Además, no necesita #import "appDelegate.h" en MyViewController.h si todo lo que necesita es hacer referencia a la propiedad myFlag en la implementación . En su lugar, impórtelo en el archivo MyViewController.m .


No leí todo, pero puedes hacer declaraciones hacia adelante con @class. Usualmente como resuelvo dependencias circulares.