8

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

做了什么:

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

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

在 LoginViewController.h 中添加了 outlet。

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

问题描述:

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

我尝试了几次尝试并阅读了十几个论坛主题,但没有办法。除了白色窗口背景外,没有显示任何内容。我怎样才能做到正确?

参考代码:

登录视图控制器.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

登录视图控制器.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;
}

更新!!!伙计们,谢谢大家,我发现了另一个问题。一旦我得到您的批准,我的代码(当然是在适当的版本之后)是正确的,我启动了模拟器,发现我的应用程序崩溃了,但出现以下异常:

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

感谢 StackOverflow,我修复了它。 已加载 nib 但未设置视图出口 - InterfaceBuilder 的新功能

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

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

可能这些信息汇总到一个点会帮助其他新人更快地通过我通过的方式。

4

3 回答 3

8

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

self.window.rootViewController = self.loginViewController;

删除这一行:

[self.window.rootViewController presentModalViewController:self.loginViewController animated:NO];
于 2013-03-13T21:39:32.237 回答
2

你必须在你的AppDelegate.mrootViewController中设置这样的

self.window.rootViewController = self.loginViewController;
于 2013-03-13T21:38:58.937 回答
0

您是否曾使用故事板创建界面?(故事板是 iOS 5 的新功能)它们基本上是一种在一个文件中布置所有视图控制器并在视觉上设置它们之间的连接的方式。使用故事板,您想要做的事情真的很容易。当您在情节提要文件上设置视图控制器时,您将看到一个指向您设置的第一个情节提要的箭头。这意味着当您运行您的应用程序时,它将加载初始视图。如果您喜欢首先加载不同的视图,只需将该箭头拖到不同的视图控制器。

于 2013-03-13T22:00:50.407 回答