2013-03-13 8 views
8

Jestem nowym programistą iOS i utknąłem z jednym problemem.Połączyć razem: AppDelegate, ViewController i XIB

Co zostało zrobione:

Stworzyłem aplikację na iOS. Początkowo miał main.m, AppDelegate.h, AppDelegate.m i kilka innych plików pomocniczych (nie z kodem), które są zwykle tworzone.

Następnie ręcznie utworzyłem plik XIB z interfejsem (LoginView.xib) i ręcznie dodałem LoginViewController.h oraz LoginViewController.m, aby kontrolować XIB.

Dodano gniazda do LoginViewController.h.

W końcu ustawiłem klasę właściciela pliku (LoginViewController) i utworzyłem połączenia między XIB i LoginViewController.h.

Opis problemu:

muszę pokazać instancję logowania kontrolera widoku i widoku pokaz logowania natychmiast przy starcie aplikacji.

Próbowałem kilku prób i przeczytałem kilkanaście wątków na forum, ale nie ma mowy. Nic nie jest wyświetlane z wyjątkiem tła białego okna. Jak mogę to zrobić poprawnie?

kod

referencyjny:

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; 
} 

AKTUALIZACJA !!! Chłopaki, dzięki Wam wszystkim znalazłem inny numer. Gdy mam swój zatwierdzić że mój kod (po odpowiednim wydaniu, oczywiście) jest poprawna, zaczęłam symulator i zobaczyłem, że moje app ulega awarii z następującym wyjątkiem:

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

Dzięki StackOverflow naprawiłem go. Loaded nib but the view outlet was not set - new to InterfaceBuilder

Notowanie Josh Sprawiedliwości komentarzu od tematu I, pod warunkiem link:

  1. Otwórz plik XIB powodując problemy
  2. Kliknij ikonę właściciela pliku, na lewym pasku (Top One, wygląda jak żółte obrysowane pole)
  3. Jeśli nie widzisz paska po prawej stronie, kliknij trzecią ikonę nad "widokiem" na pasku narzędzi. To pokaże pasek z prawej strony.
  4. Na pasku bocznym po prawej stronie kliknij trzecią kartę - tę, która wygląda trochę jak gazeta.
  5. W "Klasie niestandardowej" u góry upewnij się, że klasa jest nazwa ViewController, która powinna odpowiadać temu widokowi.Jeśli nie, wpisz go
  6. Na pasku bocznym po prawej stronie kliknij ostatnią kartę - tę, która wygląda jak kółko ze strzałką w nim.
  7. Powinieneś zobaczyć "wyloty" z "podglądem" pod nim. Przeciągnij kółko obok niego na ikony „widok” na lewym pasku (na dole jeden, wygląda jak biały kwadrat z grubym szarym konturem
  8. zapisać xib i ponownie uruchomić

Prawdopodobnie Te informacje zebrane w jednym miejscu pomoże innych przybyszów przejść drogę zdałem szybciej.

+0

Chłopaki, po tym, jak mój widok logowania jest doskonale widoczny przy starcie, spotkałem się z innym problemem: pola tekstowe nie są edytowalne :(klikam pole tekstowe, mam kursor w środku, ale nie mogę ani pisać znaków (nawet klawiatura się nie ujawnia) ani zmieniać ostrości na inne textfield Czy masz jakieś sugestie? Dziękujemy! – DaddyM

+0

I jeszcze jedno pytanie: czy naprawdę potrzebuję tego IBOutlet: IBOutlet UIView * _loginView; ????? – DaddyM

Odpowiedz

8

Ustaw LoginViewController jako kontroler widoku głównego w aplikacji: didFinishLaunchingWithOptions: method.

self.window.rootViewController = self.loginViewController; 

usunąć tę linię:

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

dziękuję bardzo pomogło mi – DaddyM

2

Musisz ustawić rootViewController takiego w swojej AppDelegate.m

self.window.rootViewController = self.loginViewController; 
+0

dziękuję za odpowiedź i przykro, że nie zaznaczam go jako faktycznej odpowiedzi. bvogelzang jest jeszcze bardziej precyzyjny – DaddyM

0

Czy pracował przy tworzeniu interfejsu Storyboard jeszcze? (Storyboardy są nowością od iOS 5). Są w zasadzie sposobem na rozmieszczenie wszystkich kontrolerów widoku w jednym pliku i wizualne ustawienie połączeń między nimi. To, co chcesz zrobić, jest bardzo proste dzięki storyboardom. Po skonfigurowaniu kontrolerów widoku w pliku scenorys zobaczysz strzałkę wskazującą na pierwszy utworzony scenorys. Oznacza to, że po uruchomieniu aplikacji jest to początkowy widok, który zostanie załadowany. Jeśli wolisz załadować inny widok, po prostu przeciągnij strzałkę do innego kontrolera widoku.

+0

Ryan, dziękuję, oczywiście, nauczę się tej techniki, tym razem chciałbym zrozumieć "jak działa", więc zadając moje głupie pytanie. – DaddyM

Powiązane problemy