2011-09-03 48 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