2012-01-04 22 views
0

我在這裏有一個泡菜..建立一個包含iOS遊戲可以說兩個視圖:BaseView和MapView。現在,這些當然有相同的AppDelegate。應用程序委託分配的對象顯示在多個子視圖?

這些都使用名爲rivbox的UIView子類。在之前的版本中,我在Base和Map-view中都分配了一個rivbox實例。當我意識到我會有很多使用這個rivbox的子視圖時,我選擇在appDelegate中分配只有一個rivbox實例,然後,當子視圖加載時,通過appDelegate從「借用」rivbox使用這些漂亮的功能。

-(void)viewDidLoad { 
//Get all the sweets from the parent! 
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    rivbox = appDelegate.rivbox; 
    [self.view addSubview:rivbox]; 
... 
} 

而這個功能是用於更新的所有權,如果我們回到這個觀點再次

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    if(rivbox != nil) { 
     [rivbox setDelegate:self]; 
     [self.view addSubview:rivbox]; 
    } 
} 

這工作得很好!我在appDelegate中找到了rivbox,它已經更新了!當我移動到另一個視圖時,它在那裏加載也很好!但是當我回到第一個視圖時,這似乎在泄漏?!?!即使先前的視圖現在擁有它,我仍然無法在我回到之前的視圖中看到流鏡盒!

問題是:這有什麼問題?每當我返回到已經加載的視圖時,是否真的必須添加rivbox作爲子視圖?如果我刪除該字符串,那麼當我返回到先前的視圖時,我看不到MyBox。

回答

0

應該夠做這兩個控制器:

- (void)viewWillAppear:(BOOL)animated { 
    //Get all the sweets from the parent! 
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [self.view addSubview:appDelegate.rivbox]; 
... 
} 
2

這確實是不良的做法。如果你指的是任何類中的應用程序委託,你可能需要重新思考你在做什麼。

Apple's docs

應用程序委託是 由UIApplicationMain函數在應用程序啓動時創建一個自定義的對象,通常。這個 對象的主要工作是處理應用程序中的狀態轉換。例如, 此對象負責啓動時初始化和處理 向後和向後的轉換。

引用應用程序代表其他任何東西都像使用全局變量。這看起來像是一個簡單的捷徑,但隨着代碼庫的增長,可能會很快結束混亂的混亂。

應用程序委託就是它所說的 - UIApplication的委託對象。您創建的視圖與UIApplication無關,所以不應該放在它的代表附近。

設計和構建簡單的自包含類,鼓勵重複使用。從長遠來看,你會很高興你做到了。

您認爲通過創建這個單一的rivbox有什麼優勢?

+0

最小化對象的分配?提及代表有什麼問題? – Hjalmar 2012-01-04 16:42:42

+0

用更多描述更新了我的答案。 – 2012-01-04 17:47:46

相關問題