2013-03-13 94 views
8

我是iOS編程新手,遇到了一個問題。連接在一起:AppDelegate,ViewController和XIB

做了什麼:

我已經創建了iOS應用程序。 最初它有main.m,AppDelegate.h,AppDelegate.m和一些通常創建的其他支持文件(不包括代碼)。

然後我手動創建帶界面的XIB文件(LoginView.xib)並手動添加LoginViewController.h和LoginViewController.m來控制XIB。

將網點添加到LoginViewController.h。

所有我設置文件的所有者類(LoginViewController)和廈門國際銀行和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

報價從主題喬希司法評論我提供的鏈接:

  1. 打開XIB文件左邊欄(頂部一個,長相上文件的所有者圖標造成的問題
  2. 點擊就像一個黃色輪廓框)
  3. 如果你沒有看到右側欄中,單擊上方的工具欄中的「查看」第三個圖標。這將顯示右側側邊欄
  4. 在右側邊欄中,單擊第三個標籤 - 看起來有點像報紙的標籤
  5. 在頂部的「Custom Class」下,確保Class是應與此視圖相對應的ViewController的名稱。如果沒有,請輸入它
  6. 在右側邊欄中,單擊最後一個選項卡 - 看起來像一個帶箭頭的圓形的選項卡
  7. 您應該在其下看到帶有「view」的「outlets」。在拖動圓圈旁邊的「查看」圖標左邊欄上(下一個,看起來像一個白色方形厚厚的灰色輪廓
  8. 保存XIB並重新運行

可能這些信息彙總到一個點將幫助其他新人通過我傳遞更快的方式。

+0

夥計們,我的登錄視圖在啓動後完美顯示,我遇到了另一個問題:textfields不可編輯:(我點擊textfield,將光標放在裏面但不能輸入字符(即使鍵盤沒有顯示)也不能改變焦點textfield。你有什麼建議嗎?謝謝! – DaddyM 2013-03-14 05:32:02

+0

還有一個問題:我真的需要這個IBOutlet:IBOutlet UIView * _loginView; ????? – DaddyM 2013-03-14 05:43:23

回答

8

將LoginViewController設置爲您的應用程序中的根視圖控制器:didFinishLaunchingWithOptions:方法。

self.window.rootViewController = self.loginViewController; 

刪除此行:

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

謝謝,它幫了我很多 – DaddyM 2013-03-14 05:11:12

2

您必須設置rootViewController像這樣在你的AppDelegate.m

self.window.rootViewController = self.loginViewController; 
+0

謝謝你的回答,並且很抱歉不會將它標記爲實際答案。 bvogelzang的一個更精確 – DaddyM 2013-03-14 05:10:43

0

你有與創建故事板的接口仍然有效? (故事板是iOS 5以來的新增功能)它們基本上是將所有視圖控制器佈置在一個文件中並以可視方式設置它們之間的連接的一種方式。故事板很容易實現。當您在故事板文件上設置視圖控制器時,您會看到指向您設置的第一個故事板的箭頭。這意味着當你運行你的應用程序,這是將加載的初始視圖。如果您希望首先加載不同的視圖,只需將該箭頭拖到不同的視圖控制器。

+0

Ryan,謝謝你,當然,我會學習這個技巧,這次我想了解「工作中的如何」,所以問我這個愚蠢的問題。 – DaddyM 2013-03-14 05:04:34