Соединитесь вместе: AppDelegate, ViewController и XIB

Я новичок в программировании iOS и застрял с одной проблемой.

что сделано:

Я создал приложение iOS. Первоначально он имел main.m, AppDelegate.h, AppDelegate.м и некоторые другие вспомогательные файлы (не с кодом), которые обычно создаются.

затем я вручную создал XIB-файл с интерфейсом (LoginView.xib) и вручную добавлен LoginViewController.h И LoginViewController.m для управления XIB.

добавлены розетки LoginViewController.h.

после всего я настроил класс владельца файла (LoginViewController) и сделал соединения между XIB и LoginViewController.h.

описание проблемы:

мне нужно показать instantiate login view controller и показать login view сразу при запуске приложения.

я попробовал несколько попыток и прочитал дюжину тем форума, но ни в коем случае. Ничего не отображается, кроме белого фона окна. Как я могу это сделать? правильно?

код:

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.м

#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.м

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

обновление!!! Ребята, благодаря вам я нашел еще одну проблему. Как только я получил ваше одобрение, что мой код (после соответствующего издания, конечно) верен, я запустил simulator и увидел, что мое приложение падает со следующим исключением:

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

спасибо чтобы StackOverflow я исправил его. загружен наконечник, но выход вида не был установлен-новый для InterfaceBuilder

цитата Джоша правосудия комментарий из темы, которую я предоставил ссылку на:

  1. открыть файл XIB, вызывающий проблемы
  2. нажмите на значок владельца файла на левой панели (верхний, выглядит как желтое очерченное поле)
  3. если вы не видите правую боковую панель, нажмите на третий значок выше " Вид " на панели инструментов. Это покажет правую боковую панель
  4. в правой боковой панели нажмите на третью вкладку-ту, которая немного похожа на газету
  5. в разделе "пользовательский класс" вверху убедитесь, что Class-это имя ViewController, которое должно соответствовать этому представлению. Если нет, введите его
  6. в правой боковой панели, щелкните на последней вкладке, которая выглядит как круг со стрелкой в нем
  7. вы должны увидеть "выходы" с "видом" под ним. Перетащите кружок рядом с ним на значок "вид" на левой панели (Нижний, выглядит как белый квадрат с толстым серым контуром
  8. сохранить xib и повторно запустить

вероятно, эта информация, объединенная в одну точку, поможет другим новичкам пройти путь, который я прошел быстрее.

3 ответов


установите LoginViewController в качестве контроллера корневого представления в приложении: didFinishLaunchingWithOptions: method.

self.window.rootViewController = self.loginViewController;

удалите эту строку:

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

вы должны установить rootViewController такое AppDelegate.м

self.window.rootViewController = self.loginViewController;

вы уже работали с созданием интерфейса с раскадровками? (Раскадровки являются новыми с iOS 5) они в основном являются способом размещения всех ваших контроллеров представления в одном файле и визуальной настройки соединений между ними. То, что вы хотите сделать, очень просто с раскадровками. При настройке контроллеров вида в файле раскадровки вы увидите стрелку, указывающую на первую настроенную раскадровку. Это означает, что при запуске приложения это начальное представление, которое будет загружаться. Если вы предпочитаете другой вид для загрузки сначала просто перетащите эту стрелку на другой контроллер вида.