连接在一起:AppDelegate,ViewController和XIB

时间:2013-03-13 21:35:55

标签: ios objective-c uiview uiviewcontroller 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

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

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

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

感谢StackOverflow我修复了它。 Loaded nib but the view outlet was not set - new to InterfaceBuilder

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

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

这些信息汇总到一点可能会帮助其他新人以更快的速度通过。

3 个答案:

答案 0 :(得分:8)

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

self.window.rootViewController = self.loginViewController;

删除此行:

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

答案 1 :(得分:2)

您必须在 AppDelegate.m

中设置rootViewController这样的内容
self.window.rootViewController = self.loginViewController;

答案 2 :(得分:0)

您是否曾使用故事板创建界面? (故事板是iOS 5中的新功能)它们基本上是一种在一个文件中布置所有视图控制器并可视地设置它们之间的连接的方法。使用故事板,您想要做的事情非常简单。在故事板文件上设置视图控制器时,您将看到指向您设置的第一个故事板的箭头。这意味着当您运行应用程序时,该应用程序将加载初始视图。如果您希望首先加载不同的视图,只需将该箭头拖动到其他视图控制器即可。