【问题标题】:Connect together: AppDelegate, ViewController and XIB连接在一起:AppDelegate、ViewController 和 XIB
【发布时间】:2013-03-02 01:47:18
【问题描述】:

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

做了什么:

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

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

在 LoginViewController.h 中添加了 outlet。

毕竟我设置了文件的所有者类 (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;
}

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

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. 在顶部的“自定义类”下,确保 Class 是应与该视图对应的 ViewController 的名称。如果没有,请输入它
  6. 在右侧边栏中,单击最后一个选项卡——看起来像一个带有箭头的圆圈
  7. 您应该会看到“outlets”下面有“view”。将旁边的圆圈拖到左侧栏上的“查看”图标(底部一个,看起来像一个带有粗灰色轮廓的白色正方形
  8. 保存 xib 并重新运行

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

【问题讨论】:

  • 伙计们,现在我的登录视图在启动时完美显示后,我遇到了另一个问题:文本字段不可编辑:(我点击文本字段,光标在其中但不能输入字符(甚至键盘也没有显示)也不将焦点转移到另一个文本字段。您有什么建议吗?谢谢!
  • 还有一个问题:我真的需要这个 IBOutlet: IBOutlet UIView *_loginView; ?????

标签: ios objective-c uiview uiviewcontroller appdelegate


【解决方案1】:

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

self.window.rootViewController = self.loginViewController;

删除这一行:

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

【讨论】:

    【解决方案2】:

    您必须在 AppDelegate.m

    中像这样设置rootViewController
    self.window.rootViewController = self.loginViewController;
    

    【讨论】:

    • 感谢您的回答,很抱歉没有将其标记为实际答案。 bvogelzang 更精确。
    【解决方案3】:

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

    【讨论】:

    • 瑞恩,谢谢。当然,我会学习这项技术。这次我想了解“如何工作”。所以问我这个愚蠢的问题。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2013-10-18
    • 2017-05-19
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多