La respuesta de Firoze Lafeer es correcta, pero este problema es probablemente un síntoma de diseño deficiente en su código.
Supongo que, en su aplicación, JBXViewController es un controlador de vista padre, y a veces muestra un ViewController2 para alguna función específica. (Por ejemplo, JBXViewController muestra una lista de registros, mientras que ViewController2 edita uno de los registros.) En una situación como esta, ViewController2 no debería conocer los detalles de JBXViewController. En su lugar, JBXViewController debe dar a ViewController2 los datos que necesita a través de las propiedades de ViewController2, y si ViewController2 tiene que llamar a los métodos en JBXViewController, deben ser parte de un protocolo de delegado.
Por ejemplo, supongamos que JBXViewController actualmente tiene la siguiente propiedad, y ViewController2 acceda a ella:
@property (strong) JBXObject * currentObject;
su lugar, debe tener una propiedad currentObject en ViewController2 y JBXViewController debe configurarlo antes de mostrar el controlador de vista:
self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
Esto funciona para comunicación unidireccional: JBXViewController puede proporcionar datos de ViewController2. Si los datos deben regresar a JBXViewController (a excepción de cambiar las propiedades de currentObject), debe configurar un delegado para ViewController2. Por ejemplo:
@protocol ViewController2Delegate; // forward declaration
@interface ViewController2 : UIViewController
@property (weak) id <ViewController2Delegate> delegate;
...
@end
@protocol ViewController2Delegate <NSObject>
- (void)viewController2ShouldSave:(ViewController2*)viewController2;
- (BOOL)viewController2:(ViewController2*)viewController2 shouldAddSomoflange:(JBXSomoflange*)aSomoflange;
@end
Luego han JBXViewController cumplir con el protocolo:
@interface JBXViewController : UIViewController <ViewController2Delegate>
Establecer el delegado, ya sea en el Interface Builder o en el código de este modo:
self.myViewController2.delegate = self;
self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
y poner en práctica toda la métodos listados en ViewController2Delegate.
En conjunto, estos cambios significan tres cosas:
ViewController2 no necesita conocimientos específicos de cómo funciona JBXViewController. Esto significa que ya no tiene que importar JBXViewController.h en ViewController2.h, que resuelve tu problema inmediato.
JBXViewController ahora es más flexible. Siempre que establezca las propiedades adecuadas en ViewController2 e implemente los métodos delegados necesarios, puede cambiar todo lo que desee en JBXViewController y ViewController2 nunca lo sabrá o le importará.
ViewController2 ahora también es más flexible. Puede usarlo desde otras partes de la aplicación o moverlo a otra aplicación. Puede insertar una pantalla entre JBXViewController y ViewController2.
Estos cambios no son necesarios para que la aplicación se ejecute en su dispositivo y funcione de la manera que usted desea. Pero tendrás un tiempo más fácil en el futuro si comienzas a adoptar este tipo de diseños.
¿También está importando ViewController2.h en JBXViewController.h? –
debe haber un problema sm con "JBXViewController.h". ¿Puedes publicar algún código inicial de la clase JBXViewController? – samfisher
@FirozeLafeer: Estoy importando ViewController2.h en JBXViewController.h – Rob