我是Xcode和Objective-C的初学者,我想在没有nib文件的情况下用代码制作一个视图控制器,并按照我想要的方式来塑造它。目前,使用这个非常简单的代码,我甚至不能因为EXC_BAD_ACCESS而改变背景颜色。
我在网上读到它是关于内存管理的,但是我似乎找不到解决这个问题的方法。我的代码片段:
AppDelegate.h
#import <UIKit/UIKit.h>
#import "DefaultViewController.h"
@class DefaultViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UIViewController *rootViewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UIViewController *rootViewController;
@end
AppDelegate.m
@synthesize window = _window;
@synthesize rootViewController = _rootViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIViewController *rvc = [[DefaultViewController alloc] init];
self.rootViewController = rvc;
[rvc release];
[self.window addSubview:self.rootViewController.view];
// Override point for customization after application launch.
[self.window makeKeyAndVisible];
return YES;
}
- (void)dealloc
{
[_window release];
[_rootViewController release];
[super dealloc];
}
我制作的视图控制器,右击->新文件和没有xib的UIViewController子类!在loadView中,我只尝试这样做:
self.view.backgroundColor = [UIColor redColor];
发布于 2011-09-03 02:32:33
问题可能是rootViewController
没有初始化的视图。很难说,因为你没有显示DefaultViewController
的代码。这也可能是DefaultViewController
中的另一个错误。
FWIW,你有两个过时的ivar:
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UIViewController *rootViewController;
}
你可以删除它们,因为你合成了_window
和_rootViewController
,从来没有使用过上面的代码。
发布于 2011-09-03 04:18:02
你的代码有一些问题。但首先,获取EXC_BAD_ACCESS的关键问题是因为您在loadView中调用self.view.backgroundColor。如果重写loadView,则必须在方法内部构造视图层次结构。通过不使用该方法创建视图层次结构,您将在一个不存在的视图上调用backgroundColor。相反,完全删除loadView方法或将其注释掉并将self.view.backgroundColor移到viewDidLoad方法中。(请记住,即使是一个空的loadView方法也会有问题,您需要将其移除或注释掉)
第二..。将代码更改为
self.rootViewController = rvc; to self.window.rootViewController = rvc;
顺便说一句,一旦你添加了一个视图控制器,你就不需要再次将rootViewController的视图作为子视图添加到窗口中。将视图控制器分配给rootViewController属性会将视图控制器的视图安装为窗口的内容视图。
第三。在初始化DefaultViewController时,您需要
UIViewController *rvc = [[DefaultViewController alloc] init];
不要那样做,要这样做
DefaultViewController *rvc = [[DefaultViewController alloc] init];
发布于 2011-09-03 02:33:53
更改代码,使其成为
self.window.rootViewController = rvc;
[self.window makeKeyAndVisible];
return YES;
https://stackoverflow.com/questions/7290754
复制相似问题