2013-01-17 36 views
0

標題本身就足以滿足我的問題。不過,我會在這裏進一步解釋,考慮我有一個兩個視圖控制器A和B. A是基礎,它是推動B,在一種情況下,我希望A在B中單擊一個按鈕時從B來暗示。 Objective C允許直接調用一個視圖,如果我有那個實例。我認爲這不是一個好做法。如何處理這種情況。如何避免目標C中的單車呼叫?

感謝您的建議。

+0

您的意思是_views_或_viewControllers_? – foundry

+0

現在編輯查看控制器:) – Newbee

+0

這些在導航控制器內?你在使用故事板嗎? – foundry

回答

2

如果通過你的意思是你要調用,最初負責推動B中的一個「A的B暗示」,你只是回到一個使用「返回」按鈕,或在代碼:

[self.navigationController popViewController animated:YES]; 

B不需要一個指向,導航控制器有一個,和B有一個指針指向導航控制器,因爲導航控制器集B的navigationController財產時,它會創建B.

如果您需要設置一個A基於B中的一些行爲的屬性,你應該使用委託來做到這一點。

在B中,您創建了一個名爲delegate的屬性。

在A,當您創建B,它的委託設置爲A:

ViewControllerB* vcB = [[ViewControllerB alloc] init]; 
vcB.delegate = self; 
[self.navigationController pushViewController:vcB]; 

然後在B可以彈出之前通過委託回調至:

[self.delegate sendMessageWithValue:someValue]; 
[self.navigationController popViewController animated:YES]; 

如果您想要格外謹慎,你可以附上消息傳遞:

if ([self.delegate respondsToSelector:@selector(sendMessageWithValue:)]) { ... } 

爲了使這項工作沒有B知道任何東西關於A,比它是代表其他,B應在聲明在B的@interfacedelegate屬性聲明在頭一個委託協議(以上@interface

@protocol BDelegateProtocol 
- (void) sendMessageWithValue:(int)someValue; 
@end 

,指定預期遵循的協議:

@property (nonatomic, weak) id <BDelegateProtocol> delegate; 

,並在的@interface頭,宣傳您按照協議:

#import BViewController; 

@interface AViewController:UIViewController <BDelegateProtocol> 

這是你之後的鬆散耦合。 B不必導入A的標題。除了它符合B的協議規範之外,它不需要了解A。

B確實保持指向A的指針,但它是一個弱指針。這個非常重要。如果代理人的財產是,B會增加它的委託的保留計數1.如果委託人持有一個強烈的指針B,那麼他們都不會被解除分配。 B存在時保留數總是至少爲1,而A存在時,A總是保留數爲1而B存在:兩者都不能被銷燬。

在這種特殊情況下可能不會發生 - A不需要保留B,因爲它是Nav控制器所做的事情 - 但這種情況可能會頻繁出現,因爲委託往往是創建並擁有委託人的對象。請參閱Apple的「使用弱引用避免保留週期」Practical Memory Management

+0

如果點擊某個特定按鈕,我想要在View A中設置一個標誌,並且我不想在該情況下彈出B. – Newbee

+0

這是如何在Objective C中用Delegate處理循環引用? – Newbee

+0

@Newbee,你需要使用委託..查看更新回答 – foundry

相關問題