2011-11-05 154 views
0

我正在閱讀O'Rielly編程的iOS4,我正在使用比本書稍微更新版本的XCode。然而,這個細微的變化導致了一些混亂,因爲我無法使用XCode 4.2創建基於窗口的應用程序。顯示窗口,但不能與模擬器交互

無論如何,我開始了一個空的項目,它給了我一個沒有MainWindow.xib的iPhone應用程序的準系統結構。我已經獲得了該項目的代表.h和.m。我開始創建我自己的MainWindow.xib。我發現我必須將「Main nib文件基本名稱」設置爲「MainWindow」才能讓筆尖顯示出來,所以我這樣做了。

在我的MainWindow.xib中,我在窗口對象下添加了一個按鈕,以確保在運行項目時擁有我想要的東西。這是我的筆尖的狀態,現在

MainWindow.xib

,而無需對AppDelegate.h和AppDelegate.m任何改變,我建立並運行我的項目。我能看到按鈕!然而,我無法點擊按鈕,當我按下home按鈕並恢復了我的空應用程序時,我再也看不到按鈕了!這裏有一些文件,我沒有做任何修改:

的main.m

#import <UIKit/UIKit.h> 

#import "EmptyWindowAppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([EmptyWindowAppDelegate class])); 
    } 
} 

EmptyWindowAppDelegate.m

#import "EmptyWindowAppDelegate.h" 

@implementation EmptyWindowAppDelegate 

@synthesize window = _window; 
@synthesize managedObjectContext = __managedObjectContext; 
@synthesize managedObjectModel = __managedObjectModel; 
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 

- (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.window makeKeyAndVisible]; 
    return YES; 
} 
//...Omitted 

回答

0

您可以指定主筆尖的名字文件在您的應用程序plist(默認情況下它是MainWindow.xib)。

要進一步調查您的問題,您可以創建一個基於默認視圖的應用程序,並查看其差異。在我看來,你在App Delegate的窗口屬性和IB窗口對象之間的界面生成器中沒有建立連接。這意味着,在didFinishLaunchingWithOptions中的窗口可能爲零,並且您發送的消息將無效。

+0

我做了窗口對象是一個IBOutlet,我已經有線窗口筆尖對象引用窗口IBOutlet中,仍然沒有去。 – denniss

+0

我將我的項目與模板化的項目進行了比較。唯一的區別是模板化版本具有視圖控制器。但是,我不認爲需要一個控制器? – denniss

+0

我從來沒有嘗試過沒有視圖控制器,我不明白爲什麼你的按鈕不顯示。您可以在代碼中檢查窗口子視圖和按鈕的超級視圖,設置一些IBAction回調。在任何應用程序,它是更好的,並建議有一個視圖控制器。它顯示了 – jbat100

0

我認爲這個問題是這一行中AppDelegate.m:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

發生了什麼事是應用程序啓動時創建一個新的窗口,一個空白的背景和顯示。因爲您已經在Interface Builder中設計了窗口,所以您不必在代碼中再次執行此操作。所有你需要didFinishLaunching下...是:

[self.window makeKeyAndVisible]; 
return YES; 

然後改變 「@synthesize窗口= _window;」只讀「@synthesize窗口;」

下一步是更改AppDelegate.h文件。改變你的代碼看起來像這樣。

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 

} 
@property (strong, nonatomic) UIWindow *window; 

您可以在InterfaceBuilder中做那麼什麼是鏈接的窗口財產AppDelegate.m與你所設計的窗口。一旦你創建了窗口屬性,它將顯示在Outlet的EmptyWindowAppDelegate下。單擊並從空白對話框拖動到側面板上的窗口標籤,或直接拖動到您在屏幕上設計的窗口。

好運