2011-09-03 35 views
0

我是Xcode和Objective-C的初学者,我想在没有nib文件的代码中创建一个视图控制器,并且以我想要的形式来塑造它。目前有了这个非常简单的代码,我甚至无法改变背景颜色,因为EXC_BAD_ACCESS。不良访问 - iPhone Xcode 4

我在互联网上看到这是内存管理的东西,但我似乎无法找到解决这个问题。我的代码片段:

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]; 
} 

我通过做视图控制器,右键 - >新文件和UIViewController子类没有XIB!在loadView我只试试这个:

self.view.backgroundColor = [UIColor redColor]; 
+0

我认为你需要向我们展示的代码为你DefaultViewController。 – Abizern

+1

发布跟踪堆栈。 – WrightsCS

回答

1

问题可能是,rootViewController没有初始化视图。很难说,因为你没有显示DefaultViewController的代码。这也可能是DefaultViewController中的另一个错误。


FWIW,你有两个高德陈旧:

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    UIViewController *rootViewController; 
} 

你可以删除这些,因为你合成_window_rootViewController,从不使用以上。

0

更改代码,以便它

self.window.rootViewController = rvc; 
[self.window makeKeyAndVisible]; 
return YES; 
0

什么是你DefaultViewController里面?如果您不使用笔尖文件,您是否实施了-(void)loadView

-1
你应该叫: 的UIViewController * RVC = [[DefaultViewController页头] initWithNibName:@ “yournib” 捆绑:无]。 加载NIB视图。否则,你的rvc.view将是零。

对不起,我忽视了。

答案是:您不应该在- (void)loadView以内呼叫self.view.backgroundColor = [UIColor redColor];,因为self.viewnil首先在这个阶段。他必须证明他已在loadView中正确创建了至少self.view = [[UIView alloc] init]

+0

这个问题明确指出,笔尖没有被使用。 – Abizern

+0

对不起,我更正了答案。 – XMLSDK

1

您的代码有几个问题。但首先你得到EXC_BAD_ACCESS的关键问题是因为你在loadView中调用self.view.backgroundColor。如果你重载loadView,你必须在方法内构造你的视图层次结构。通过不在该方法中创建视图层次结构,您将在不存在的视图上调用backgroundColor。而是彻底删除loadView方法或将其注释掉,并将self.view.backgroundColor移动到viewDidLoad方法中。 (请记住,即使是空的loadView方法也会出现问题,您需要将其删除或注释掉)

Second ..更改您的代码

self.rootViewController = rvc; to self.window.rootViewController = rvc; 

BTW,一旦你添加你不需要到RootViewController的的视图中再次添加为子视图窗口视图控制器。将视图控制器分配给rootViewController属性将视图控制器的视图作为窗口的内容视图进行安装。

三。当你初始化DefaultViewController你做

UIViewController *rvc = [[DefaultViewController alloc] init]; 

不这样做,而不是做

DefaultViewController *rvc = [[DefaultViewController alloc] init]; 
+0

我认为这个函数在视图实际创建后被调用,我猜是因为上面的注释!谢谢你和其他人! – Wesley