標題本身就足以滿足我的問題。不過,我會在這裏進一步解釋,考慮我有一個兩個視圖控制器A和B. A是基礎,它是推動B,在一種情況下,我希望A在B中單擊一個按鈕時從B來暗示。 Objective C允許直接調用一個視圖,如果我有那個實例。我認爲這不是一個好做法。如何處理這種情況。如何避免目標C中的單車呼叫?
感謝您的建議。
標題本身就足以滿足我的問題。不過,我會在這裏進一步解釋,考慮我有一個兩個視圖控制器A和B. A是基礎,它是推動B,在一種情況下,我希望A在B中單擊一個按鈕時從B來暗示。 Objective C允許直接調用一個視圖,如果我有那個實例。我認爲這不是一個好做法。如何處理這種情況。如何避免目標C中的單車呼叫?
感謝您的建議。
如果通過你的意思是你要調用,最初負責推動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的@interface
的delegate
屬性聲明在頭一個委託協議(以上@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
您的意思是_views_或_viewControllers_? – foundry
現在編輯查看控制器:) – Newbee
這些在導航控制器內?你在使用故事板嗎? – foundry