连接在一起:AppDelegate,ViewController和XIB

Dad*_*dyM 8 objective-c uiviewcontroller uiview ios appdelegate

我是iOS编程的新手,遇到了一个问题.

做了什么:

我创建了iOS应用程序.最初它有main.m,AppDelegate.h,AppDelegate.m和一些其他通常创建的支持文件(不带代码).

然后我用接口(LoginView.xib)手动创建了XIB文件,并手动添加了LoginViewController.h和LoginViewController.m来控制XIB.

为LoginViewController.h添加了插座.

毕竟我设置了文件的所有者类(LoginViewController)并在XIB和LoginViewController.h之间建立了连接.

问题描述:

我需要在应用程序启动时立即显示实例化登录视图控制器并显示登录视图.

我尝试了几次尝试并阅读了十几个论坛帖子,但没办法.除了白色窗口背景外没有显示任何内容.我该怎么做对吗?

参考代码:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

AppDelegate.h

#import <UIKit/UIKit.h>
#import "LoginViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) LoginViewController *loginViewController;

@end
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE!伙计们,多亏你们,我发现了另一个问题.一旦我批准我的代码(当然在适当的版本之后)是正确的,我启动了模拟器并看到我的应用程序崩溃,但有以下异常:

NSInternalInconsistencyException with the reason [UIViewController _loadViewFromNibNamed:bundle:] loaded the ... nib but the view outlet was not set.
Run Code Online (Sandbox Code Playgroud)

感谢StackOverflow,我修复了它. 加载的笔尖但视图插座未设置 - InterfaceBuilder的新功能

Josh Justice的评论从我提供的主题链接到:

  1. 打开XIB文件导致问题
  2. 单击左侧栏上的文件所有者图标(顶部一个,看起来像一个黄色的方框)
  3. 如果您没有看到右侧边栏,请单击工具栏中"视图"上方的第三个图标.这将显示右侧边栏
  4. 在右侧边栏中,单击第三个选项卡 - 看起来有点像报纸的选项卡
  5. 在顶部的"自定义类"下,确保Class是应与此视图对应的ViewController的名称.如果没有,请输入它
  6. 在右侧边栏中,单击最后一个选项卡 - 看起来像一个带箭头的圆圈
  7. 您应该看到"outlet"下面带有"view".将旁边的圆圈拖到左侧栏上的"视图"图标(底部的一个,看起来像一个带有灰色粗轮廓的白色方块
  8. 保存xib并重新运行

可能这些信息聚合成一个点将有助于其他新人通过我更快通过的方式.

bvo*_*ang 8

在您的应用程序中将LoginViewController设置为根视图控制器:didFinishLaunchingWithOptions:方法.

self.window.rootViewController = self.loginViewController;
Run Code Online (Sandbox Code Playgroud)

删除此行:

[self.window.rootViewController presentModalViewController:self.loginViewController animated:NO];
Run Code Online (Sandbox Code Playgroud)