窗口显示但无法与模拟器交互

时间:2011-11-05 08:19:18

标签: iphone ios xcode ios5 xcode4.2

我正在阅读O'Rielly的iOS4编程,我使用的是比该书正在使用的更新版本的XCode。然而,这种微小的变化导致了一些混乱,因为我无法使用XCode 4.2创建基于窗口的应用程序。

无论如何,我开始了一个空项目,它给了我没有MainWindow.xib的iPhone应用程序的准系统结构。我已经获得了该项目的代表.h和.m。我继续创建自己的MainWindow.xib。我发现我必须将'主nib文件基本名称'设置为'MainWindow'才能显示我的笔尖,所以我就这样做了。

在我的MainWindow.xib中,我在窗口对象下面添加了一个按钮,以确保在运行项目时我拥有自己想要的东西。这是我现在的笔尖状态

MainWindow.xib

不对AppDelegate.h和AppDelegate.m进行任何更改,我构建并运行了我的项目。我能看到按钮!但是,我无法点击按钮,当我按下主页按钮并恢复我的空应用程序时,我再也看不到按钮了!以下是一些我没有对其进行任何更改的文件:

的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

2 个答案:

答案 0 :(得分:0)

您可以在应用程序plist中指定主nib文件的名称(默认情况下为MainWindow.xib)。

要进一步调查您的问题,您可以创建一个基于默认视图的应用,并查看差异。在我看来,您在App Delegate的窗口属性和IB窗口对象之间的界面构建器中没有建立连接。这意味着didFinishLaunchingWithOptions中的窗口可能是nil,因此发送它的消息将不起作用。

答案 1 :(得分:0)

我认为问题在于AppDelegate.m中的这一行:

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

当应用程序启动时,您正在创建一个带有空白背景的新窗口并显示它。因为您已经在Interface Builder中设计了窗口,所以不必在代码中再次执行此操作。在didFinishLaunching下你需要的只是:

[self.window makeKeyAndVisible];
return YES;

然后改变“@synthesize window = _window;”只读“@synthesize window;”

下一步是更改AppDelegate.h文件。将代码更改为这样。

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{

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

现在您可以在InterfaceBuilder中执行的操作是将AppDelegate.m中的窗口属性与您设计的窗口链接起来。创建窗口属性后,它将显示在Outlets for EmptyWindowAppDelegate下。单击并从空穹顶到侧面板上的Window标签,或直接到屏幕上设计的窗口。

祝你好运