2010-07-16 72 views
3

我有兩個通用的應用程序...一個是給我一個EXC_BAD_ACCESS錯誤我做到這一點的應用程序委託時:EXC_BAD_ACCESS在[窗口addSubview:viewcontroller.view]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after application launch. 
    ScrollViewController *vc = [[ScrollViewController alloc] init]; 
    [window addSubview:vc.view]; // EXC_BAD_ACCESS here 
    [window makeKeyAndVisible]; 

    return YES; 
} 

我做的完全一樣的(相同的代碼,相同的滾動視圖控制器類)在我的其他應用程序,並得到沒有錯誤...我的滾動視圖加載正常。

這個問題讓我瘋狂。這裏是ScrollViewController實現:

@implementation ScrollViewController 

- (void)loadView { 
    [super loadView]; 
    UIScrollView *s = [[UIScrollView alloc] initWithFrame:[[self view] bounds]]; 

    NSArray *a = [[NSBundle mainBundle] loadNibNamed:@"JCEKKeyboard" owner:self options:nil]; 

    UIView *v = [a objectAtIndex:0]; 

    [s setContentSize:CGSizeMake(400, 500)]; 
    [s addSubview:v]; 
    [[self view] addSubview:s]; 
} 
+0

向我們展示創建視圖的代碼,如果您說,它是在-init中完成的。 – jer 2010-07-16 11:59:49

回答

1

init不應該創建視圖,loadView會這樣做。視圖爲零時調用視圖getter(vc.view)將導致調用loadView。

閱讀documentation for loadView,您使用不正確。您不應該從loadView調用super,並且您必須在視圖控制器中設置視圖屬性。你不應該在loadView中爲view [self view]調用getter,因爲getter調用loadView。您應該在loadView中創建視圖並設置視圖屬性。

像這樣:

- (void)loadView { 
    NSArray *a = [[NSBundle mainBundle] loadNibNamed:@"JCEKKeyboard" owner:self options:nil]; 
    UIView *v = [a objectAtIndex:0]; 

    CGRect frame = [UIScreen mainscreen].applicationFrame; 
    UIScrollView *s = [[UIScrollView alloc] initWithFrame: frame]; 
    [s setContentSize:CGSizeMake(400, 500)]; 
    [s addSubview:v]; 

    self.view = s; 
} 
+0

我按照你的建議將它改成了self.view = s,並讓它工作,但是如果我不打電話超級,那麼應用程序在啓動時崩潰。 – joec 2010-07-16 15:34:00

+0

您是否在IB中使用了該視圖的筆尖?如果是這樣,你不應該使用loadView。讓系統加載筆尖,你可以在viewDidLoad中添加任何你需要的東西,而不是在loadView中。閱讀loadView的文檔的討論部分,我在答案中提供了一個鏈接。 – progrmr 2010-07-16 17:39:25

+0

我使用loadView以編程方式加載滾動視圖,然後使用loadNibNamed向其添加子視圖 – joec 2010-07-16 18:57:11

2

請記住,當添加的子視圖即[someView addSubview:someOtherView],你可能需要添加的子視圖的全圖(的someOtherView子視圖)。如果可見,它會在您添加的子視圖的新圖上觸發渲染。因此,如果新圖中的任何子視圖沒有正確保留,則可能會出現此錯誤。您必須測試您要添加的整個視圖層次結構。

使用以下的控制檯gdb命令:

要測試的單個對象有效

po [someView description] 

要測試的

po [someView subviews] 

子視圖要測試各個子視圖(例如第一個子視圖元素0)

po [[someView subviews] objectAtIndex:0] 

最後測試的整個視圖層次一次

po [someView recursiveDescription] 

這些命令,特別是recursiveDescription,也可用於故障排除佈局問題非常有用的。