【问题标题】:Where is _mainViewController declared and initialized?_mainViewController 在哪里声明和初始化?
【发布时间】:2011-04-08 20:57:41
【问题描述】:

我最近将我的 IDE 更新到 XCode 4.0,并看到 Utility-Application 样板代码发生了奇怪的变化:

一、MainViewController.h-文件:

#import <UIKit/UIKit.h>
@class MainViewController;

@interface UtilityAppDelegate : NSObject <UIApplicationDelegate> {
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainViewController *mainViewController;
@end

问题 1:首先在哪里声明了“mainViewController”?我在任何地方都没有找到它。

在 *.m 文件中有一个

@synthesize mainViewController=_mainViewController;

声明。所以我的第二个问题:“_mainViewController”隐藏在哪里?在任何地方都找不到声明。我猜它以某种方式来自主 *.nib 文件。

但还有另一个问题:我确实在我最近的一个项目中添加了 UINavigationController,并且不再需要 mainViewController。但是当我从 MainViewController.m/.h 中删除 @property 和 @synthesize 时,由于此异常,我无法再运行该应用程序:

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mainViewController.'

发生在这一行

    int retVal = UIApplicationMain(argc, argv, nil, nil);

在 main.m.

感谢您的帮助。

【问题讨论】:

    标签: iphone xcode4


    【解决方案1】:

    看看你的 info.plist 它应该在那里声明。如果您使用模板创建应用程序,则它由 plist 配置。这样做有一些隐式声明,mainWindow.xib(在我的示例中)包含的不仅仅是一个窗口。有到 appDelegate 和 viewController 的连接,请参见第二个屏幕截图。

    截图最后一行:

    【讨论】:

    • 这是 MainWindow,而不是 MainVieWController。 Info.plist 将 NIB 定义为自动加载。
    • 是的,但是在 nib 文件中有到应用程序委托和 viewController 的连接。
    【解决方案2】:

    问题一:

    当您使用这样的声明时,您也不需要显式定义属性。

    .h

    @property (nonatomic, retain) IBOutlet MainViewController *mainViewController;
    

    .m

    @synthesize mainViewController=_mainViewController;
    

    问题 2:

    _mainViewController 没有隐藏。它指向 mainViewController,它在 .h 中的 @property 语句中隐式定义

    @synthesize mainViewController=_mainViewController;
    

    此格式用于区分 ivar 和其他属性。它指的是mainViewController。

    问题 3:

    您删除了 mainViewController 的声明 @property/@synthesize,但它仍然存在于 nib 文件 (IB) 中。从 IB 中删除它,您应该可以继续使用了。

    【讨论】:

    • 谢谢。我有两个版本的不同语言的 xib 文件。其中一个没有正确更新。
    • 并非所有平台都支持不受显式变量支持的属性,顺便说一句。它们似乎在 ARM (iOS) 和 x64 上,但不是 x86。
    【解决方案3】:

    您是第一次遇到新的 ABI。不再需要为属性实际声明变量。如果您使用@property@synthesize,则会自动为您生成一个支持ivar。

    您可能会收到 KVC 错误,因为 NIB 仍然引用旧属性。您应该在编译期间看到有关此问题的警告。在 IB 中,查看您的 App Delegate;它可能仍然有 mainViewController 的出口,并且您可能仍在生成 MainViewController。您需要将它们从 NIB 中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多