Conectar juntos: AppDelegate, ViewController y XIB

Soy nuevo en la progtwigción de iOS y me quedé atrapado con un problema.

Lo que fue hecho:

He creado una aplicación de iOS. Inicialmente tenía main.m, AppDelegate.h, AppDelegate.m y algunos otros files de soporte (no con código) que normalmente se crean.

Luego, he creado manualmente el file XIB con la interfaz (LoginView.xib) y agregado manualmente LoginViewController.h y LoginViewController.m para controlar XIB.

Se agregaron salidas a LoginViewController.h.

Después de todo, configuré la class de propietario del file (LoginViewController) e hice conexiones entre XIB y LoginViewController.h.

Descripción del problema:

Necesito mostrar el controller de vista de inicio de session instantáneo y mostrar la vista de inicio de session inmediatamente al inicio de la aplicación.

Intenté varios bashs y leí una docena de hilos del foro, pero de ninguna manera. No se muestra nada excepto el background de la window blanca. ¿Cómo puedo hacerlo correcto?

Código de reference:

LoginViewController.h

#import <UIKit/UIKit.h> @interface LoginViewController : UIViewController { IBOutlet UIView *_loginView; IBOutlet UITextField *_tfLogin; IBOutlet UITextField *_tfPassword; IBOutlet UIButton *_btnLoginToSystem; } - (IBAction)attemptLogin:(id)sender; @end 

LoginViewController.m

 #import "LoginViewController.h" @interface LoginViewController () @end @implementation LoginViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)attemptLogin:(id)sender { } @end 

AppDelegate.h

 #import <UIKit/UIKit.h> #import "LoginViewController.h" @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) LoginViewController *loginViewController; @end 

AppDelegate.m

 #import "AppDelegate.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; self.loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil]; [self.window.rootViewController presentModalViewController:self.loginViewController animated:NO]; [self.window makeKeyAndVisible]; return YES; } 

¡¡¡ACTUALIZAR!!! Chicos, gracias a todos ustedes, he encontrado otro problema. Una vez que obtuve su aprobación, mi código (después de la edición apropiada, por supuesto) es correcto, comencé el simulador y vi que mi aplicación se bloquea con la siguiente exception:

 NSInternalInconsistencyException with the reason [UIViewController _loadViewFromNibNamed:bundle:] loaded the ... nib but the view outlet was not set. 

Gracias a StackOverflow lo arreglé. Nib cargada, pero la salida de la vista no estaba configurada, nueva en InterfaceBuilder

Cita del comentario de Josh Justice del tema que proporcioné enlace a:

  1. Abra el file XIB causando problemas
  2. Haga clic en el ícono del propietario del file en la barra izquierda (la primera, parece un recuadro amarillo).
  3. Si no ve la barra lateral derecha, click el tercer icono encima de "vista" en su barra de herramientas. Esto mostrará la barra lateral derecha
  4. En la barra lateral derecha, click la tercera pestaña, la que parece un periódico
  5. En "Clase personalizada" en la parte superior, asegúrese de que Clase es el nombre del ViewController que debería corresponder a esta vista. Si no es así, ingréselo
  6. En la barra lateral derecha, click la última pestaña: la que parece un círculo con una flecha en ella
  7. Debería ver "puntos de venta" con "vista" debajo. Arrastre el círculo al lado del icono de "vista" en la barra izquierda (la parte inferior, se ve como un cuadrado blanco con un grueso contorno gris
  8. Guarde el xib y vuelva a ejecutar

Probablemente, esta información agregada en un punto ayudará a otros recién llegados a pasar la forma en que pasé más rápido.

Establezca LoginViewController como su controller de vista raíz en su aplicación: didFinishLaunchingWithOptions: method.

 self.window.rootViewController = self.loginViewController; 

elimine esta línea:

 [self.window.rootViewController presentModalViewController:self.loginViewController animated:NO]; 

Tienes que configurar el rootViewController así en tu AppDelegate.m

 self.window.rootViewController = self.loginViewController; 

¿Ya trabajaste con la creación de tu interfaz con storyboards? (Storyboards son nuevos a partir de iOS 5) Son básicamente una forma de diseñar todos sus controlleres de vista en un solo file y establecer visualmente conexiones entre ellos. Lo que quieres hacer es muy fácil con storyboards. Cuando configura controlleres de vista en su file de guiones charts, verá una flecha que apunta al primer guión gráfico que configuró. Eso significa que cuando ejecutas tu aplicación, esa es la vista inicial que se cargará. Si prefiere una vista diferente para cargar primero, simplemente arrastre esa flecha a un controller de vista diferente.