将 UINavigationController 添加到窗口时的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】将 UINavigationController 添加到窗口时的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS when adding UINavigationController to window 【发布时间】:2011-05-29 22:46:45 【问题描述】:

我正在开发一个使用多个视图控制器和导航控制器的应用程序。当应用程序运行并执行以下代码时,尝试添加子视图时会抛出异常。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    [self.window addSubview:[navigationController view]];
    [self.window makeKeyAndVisible];

我这样声明导航控制器:

@interface SimpleContactsAppDelegate : NSObject <UIApplicationDelegate> 
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    UIWindow *window;  
    UINavigationController *navigationController;
    // view for adding new contacts
    UIViewController *newContactView;
    UIButton *addButton;

    // controls for the addContactView
    UIButton *saveContactButton;
    UITextField *nameField;
    UITextField *emailField;
    UITextField *phoneField;

    UITableView *contactsTable;

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;  
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;  
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@property (nonatomic, retain) IBOutlet UIButton *addButton;
@property (nonatomic, retain) IBOutlet UITableView *contactsTable;

// controller and fields for the form
@property (nonatomic, retain) IBOutlet UIViewController *newContactView;
@property (nonatomic, retain) IBOutlet UITextField *nameField;
@property (nonatomic, retain) IBOutlet UITextField *emailField;
@property (nonatomic, retain) IBOutlet UITextField *phoneField;
@property (nonatomic, retain) IBOutlet UIButton *saveContactButton;

我已将导航控制器连接到 XIB 中的 Delegate 对象。随意看看我的完整来源:https://github.com/agmcleod/SimpleContacts/tree/parttwo

我尝试过将 Instruments 与 NSZombie 一起使用,但它似乎并没有停下来,让我检查一下出了什么问题。它有时也会继续运行,并且不会终止。我最终不得不使用活动终端强制退出它。

【问题讨论】:

【参考方案1】:

首先,你声明一个属性,但是通过它的实例变量而不是使用属性来访问 UINavigationController。

使用这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    [self.window addSubview:[self.navigationController view]];
    [self.window makeKeyAndVisible];
    return YES;

其次,您将主 nib 文件的名称更改为“Window.xib”。您要么必须将其改回“MainWindow.xib”,要么必须编辑 SimpleContacts-Info.plist 并将“Main nib file base name”的值更改为“Window”。

【讨论】:

非常感谢!!! :D。这解决了它。重命名文件,并将 self 添加到 navigationController。

以上是关于将 UINavigationController 添加到窗口时的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

将 UIViewController 放在 UINavigationController 堆栈之上

将 UIViewController 添加到 UINavigationController 的问题

如何将 UIView 添加到 UINavigationController 堆栈

将 UINavigationBar 添加到没有 UINavigationController 的 UITableViewController

为啥我们将 UIViewController 传递给 UINavigationController 类?

如何将 CAGradientLayer 应用于 UINavigationController 背景