【问题标题】:Window is shown but cannot interact with the simulator显示窗口但无法与模拟器交互
【发布时间】:2011-12-22 13:42:59
【问题描述】:

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

无论如何,我开始了一个空项目,它为我提供了一个没有 MainWindow.xib 的 iPhone 应用程序的准系统结构。我已经获得了项目的委托 .h 和 .m。我继续创建自己的 MainWindow.xib。我发现我必须将 'Main nib file base name' 设置为 'MainWindow' 才能让我的 nib 完全显示,所以我这样做了。

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

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

ma​​in.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

【问题讨论】:

    标签: iphone ios xcode ios5 xcode4.2


    【解决方案1】:

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

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

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

    [self.window makeKeyAndVisible];
    return YES;
    

    然后更改“@synthesize window = _window;”只需阅读“@synthesize 窗口;”

    下一步是更改 AppDelegate.h 文件。将您的代码更改为如下所示。

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    {
    
    }
    @property (strong, nonatomic) UIWindow *window;
    

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

    祝你好运

    【讨论】:

      【解决方案2】:

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

      要进一步调查您的问题,您可以创建一个基于默认视图的应用程序,看看有什么区别。在我看来,您在 App Delegate 的窗口属性和 IB 窗口对象之间的界面构建器中没有建立任何联系。这意味着在 didFinishLaunchingWithOptions 中的窗口可能为 nil,因此您发送的消息将无效。

      【讨论】:

      • 我将窗口对象设置为 IBOutlet,并且已将 Window nib 对象连接到引用窗口 IBOutlet,但仍然不行。
      • 我将我的项目与模板化的项目进行了比较。唯一的区别是模板化版本有一个视图控制器。但是,我认为不需要控制器?
      • 我从来没有尝试过没有视图控制器,我不明白为什么你的按钮不显示。您可以在代码中检查窗口子视图和按钮的超级视图,设置一些 IBAction 回调。在任何应用程序中,最好使用视图控制器并建议使用。
      • 它确实显示了。但是当我点击它时,它不会变成蓝色。是的,我知道在实际项目中会推荐控制器,但我只是想了解项目是如何从头开始连接的。
      • 可能是窗口的interactionEnabled默认为NO。
      猜你喜欢
      • 2019-01-01
      • 2022-10-14
      • 2021-01-07
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多