2013-07-01 79 views
1

我有兩個ViewControllers在我的應用程序ViewController1.mViewController2.mloadview被稱爲無限次

AppDelegate我使用此代碼。

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{ 
    self.viewController = [[ViewController1 alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
} 
else 
{ 
    self.viewController = [[ViewController1 alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
} 


self.window.rootViewController = self.viewController; 

[self.window makeKeyAndVisible]; 

在ViewController1.m我添加了一個按鈕,上按鈕點擊我顯示另一視圖控制器ViewController2.m這樣的:

ViewController2 * obj = [[ViewController2 alloc] initWithNibName:nil bundle:nil]; 

[self.view addSubview:obj.view]; 

在ViewController2.m的loadView我加入另一個按鈕等這

NSLog(@"\n Load view called"); 

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

[button addTarget:self action:@selector(onButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

[button setTitle:@"Back to previous view" forState:UIControlStateNormal]; 

button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0); 

[self.view addSubview:button]; 

當我運行我的應用程序,在點擊本按鈕ViewController1.m應用程序掛起和loadViewØ f ViewController2.m開始無限調用。

我不知道這個問題的背後,我只是想加載另一個ViewController的按鈕單擊,我沒有使用任何導航控制器。

有人能指出這個問題背後的原因嗎?

+0

只看到方法堆棧跟蹤,你可以很容易地找到哪個方法或語句一次又一次地調用loadview – Iducool

回答

4

不要在loadView中這樣做。請將您的代碼移至viewDidLoad。問題是你正在訪問self.viewloadView,基本上調用loadView,因爲從來沒有返回到loadView的初始調用。

對不起,繞口令...... loadView當視圖尚未實例化時自動調用。只有當它返回時視圖初始化完成。如果它沒有返回,並且您嘗試訪問view屬性,它會再次調用它。在你的情況下,它是遞歸的,因爲你仍然在loadView方法。

docs

視圖控制器調用時,要求其視圖屬性,但目前無此方法。此方法加載或創建視圖並將其分配給視圖屬性。

0

當您使用initWithNibName時,請勿過度使用loadView。它是一個錯誤的設計。如果你不希望在初始化階段使用viewDidLoad,想的東西,然後覆蓋此方法,

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // write your init code here. 
    } 
    return self; 
} 
0

loadView獨家的工作就是設置viewControllers查看屬性。這可能是像

self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];

試想一下,你的觀點屬性的getter看起來是這樣的:

if(!_view) 
    [self loadView]; 

    return _view; 

這意味着,如果你設置視圖(如在使用前self.view loadView),loadView會被一次又一次地調用。我的建議通常是避免重寫loadView,而是創建一個從awakeFromNibinitWithNib...都調用的簡單configureView方法,以便可以從故事板或筆尖正確創建視圖或通過代碼實例化視圖。