2012-01-06 89 views
0

我很努力地理解爲什麼下面的第一種方法可以隱藏和刪除視圖的子視圖。在這第一種方法中,我通過引用傳遞指針。在第二種方法中,我不太一般,我有一個用於刪除特定視圖的委託方法。我想使用第一種方法,因爲我有幾個我想要應用的視圖。我應該提到,只要第一種方法在實現類中被調用,第一種方法就不會失敗。當我從視圖控制器中調用它時,它會失敗,我想解僱它。當第一個方法失敗時,我在removeFromSuperview行上得到EXC_BAD_ACCESS。從超級景觀中刪除視圖iOS

-(void)closeView:(UIViewController **)viewController 
{ 
[UIView transitionWithView:self.view 
        duration:UINavigationControllerHideShowBarDuration 
        options:UIViewAnimationOptionCurveLinear 
       animations:^ 
    { 
    [[*viewController view] setAlpha:0.0]; 
    } 
       completion:^(BOOL finished) 
    { 
    [[*viewController view] removeFromSuperview]; 
    [*viewController release], *viewController = nil; 
    }]; 
} 

-(void)closeButtonClicked 
{ 
[delegate closeView:&self]; 
} 

// 
// This method works without fail: 
// 

-(void)closeView 
{ 
[UIView transitionWithView:self.view 
        duration:UINavigationControllerHideShowBarDuration 
        options:UIViewAnimationOptionCurveLinear 
       animations:^ 
    { 
    // In this context viewController is defined in the class interface 
    [[viewController view] setAlpha:0.0]; 
    } 
       completion:^(BOOL finished) 
    {  
    [[viewController view] removeFromSuperview]; 
    [viewController release], viewController = nil;  
    }]; 
} 

-(void)closeButtonClicked 
{ 
[delegate closeView]; 
} 

回答

2

首先,它不是根據風格指南,而不是一般的好主意,在這樣的方法中執行viewController的發佈。它會讓你很快陷入麻煩。如果此方法的調用者負責viewController(它已完成保留),那麼它也應該釋放它。這很可能是第一種方法不能在viewcontroller內工作的原因。

在第二種方法中,您不傳入viewController作爲參數,這意味着它需要在上下文中定義。

如果你沒有在這個方法中釋放的viewController,那麼你就需要設置其可變爲零或者,你可以簡單地把它作爲正常的參數:

-(void)closeView:(UIViewController *)viewController 
{ 
[UIView transitionWithView:self.view 
        duration:UINavigationControllerHideShowBarDuration 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^ 
    { 
    [[viewController view] removeFromSuperview]; 
    } 
       completion:nil]; 
} 

那麼您需要爲此在調用點:

[self closeView:childViewController]; 
[childViewController release]; childViewController = nil; 

動畫完成之前,它安全地釋放孩子以這種方式,因爲動畫阻止含蓄保留了塊,包括參數的viewController引用的所有對象。因此,在動畫塊釋放它之前,不會調用該子的dealloc。 這不適用於您的第一個代碼示例,因爲您將指針傳遞給變量。也就是說,動畫塊不知道它需要保留孩子。

順便說一句,我不知道你爲什麼要設置alpha,在上面的例子中我顯示你也可以刪除已經在動畫塊中的視圖。在UIView Class Reference中查看更多內容。

+0

謝謝你關於不需要alpha的建議。這是個好消息。讓我再解釋一下我的推理,讓你明白我爲什麼要發佈正在被刪除的視圖。我這樣做是爲了將操作的處理從正在顯示的子視圖中分離出來。我希望父母的看法決定如何處理孩子。我不希望此操作的默認操作是刪除和取消子視圖。據說,我不明白爲什麼父母從視圖中刪除一個孩子並使其失效,這是有問題的。你能解釋一下:) – banDedo 2012-01-06 21:36:44

+0

就像一個額外的評論,removefromsuperview沒有在塊中動畫。我仍然必須將它放入帶有alpha動畫的完成塊中,才能按照需要工作。難道我做錯了什麼? – banDedo 2012-01-07 00:44:22

+0

@PatrickHogan對不起,我應該適當地修改你的代碼。對於選項:您需要選擇其中一個UIViewAnimationOptionTransition選項,以使動畫適用於已移除的視圖。 CrossDissolve可能是你想要的。我將調整代碼以表明這一點。 – fishinear 2012-01-07 02:13:26

0

** viewcontroller和&自我不是要走的路。在Objective-C中,你在子視圖本身中執行[self.view removeFromSuperview],在你做的release的父視圖控制器中,或者用ARC只是用另一個視圖替換子視圖。

+0

感謝您的建議,我在上面留下了詳細的評論,解釋我的立場。你能否在所寫的內容中澄清你的?)? – banDedo 2012-01-06 21:39:09

相關問題