[英]Pass a reference to ViewController in prepareForSegue
我有2個視圖控制器,稱之為ViewController1和ViewController2。 當我想加載ViewController2時,從ViewController1調用模態segue。 我在ViewController1中有一個方法需要在ViewController2顯示時調用。 我的想法是在ViewController2中有一個屬性,它是對ViewController1的引用,以便我可以訪問該方法。
@property (strong, nonatomic) ViewController1 *vc1Reference;
這個屬性將在prepareForSegue方法中設置,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 1 if ([[segue identifier] isEqualToString:@"sequeToVC2"]) { // 2 ViewController2 *vc2 = segue.destinationViewController; // 3 vc2.vc1Reference = (ViewController1*)segue.sourceViewController; // 4 } }
但是第4行給出了這個錯誤:ARC不允許將Objective-C指針隱式轉換為'int *'。
我該怎么設置參考?
您走在正確的軌道上,但正確的方法是使用委托。
您在vc2 @interface
聲明了一個委托屬性:
@property (nonatomic, weak) id <vc2delegate> delegate //[1] (in vc2.h)
然后在prepareForSegue
設置委托:
vc2.delegate = self; //[2] (in vc1.m)
('self'是vc1的正確參考,來自vc1)
在vc2中,您定義了一個協議,這是您希望vc1從vc2響應的方法。 把它放在@interface
上方的vc2.h中
@protocol vc2delegate //[3] (in vc2.h)
- (void) delegateMethod;
@end
然后,您必須確保在vc1中實現該方法。 您還需要讓vc1知道符合委托。 將vc2導入vc1.h,並在vc1中的@interface
行中將協議名稱添加到尖括號中:
#import vc2.h
@interface vc1 <vc2delegate> //[4] (in vc1.h)
這種安排允許vc2將方法傳遞給vc1,而不必#include
vc1或了解其他任何內容。
更多詳情...
這是你的正確形式
@property (strong, nonatomic) ViewController1 *vc1Reference;
注意使用weak
引用。 您不希望strong
引用,因為您不想與委托有任何關系,除非知道它可以處理您在協議中指定的方法。 委托通常是創建委托者的對象,在另一個方向上創建strong
引用會導致內存泄漏,因為這兩個對象都不會存在。
這是你的行的正確形式:
vc2.vc1Reference = (ViewController1*)segue.sourceViewController;
請注意,我們不使用1或2中的類型/強制轉換。為了最大限度地重用代碼/解耦,我們不希望對segue任何一端的對象類型做出任何假設。 我假設你的'prepareForSegue'在vc1中。 如果不是那么該行看起來像這樣:
vc2.delegate = segue.sourceViewController
這是協議聲明。 它位於vc2的頭文件中。 vc2正在發布它對任何選擇成為其委托的對象的期望。 vc2將根據此協議發送消息,因此任何委托都需要以正確的方式響應。 您可以使用這種消息傳遞來防止vc2中的故障
if (self.delegate respondsToSelector:@selector('delegateMethod') { [self.delegate delegateMethod]; }
(這是您在vc2中用於與vc1進行通信的消息傳遞類型的示例。如果需要,您可以顯然傳遞參數並返回返回的結果)
這是編譯器的幫助程序,如果您未能實現協議,它可以向您發出警告。
最后在對象定義的某處,您需要實現該方法:
- (void) delegateMethod { // someaction; }
前幾天我碰到了類似的東西。 我最終為vc2創建了一個委托,並使用了
vc2.delegate = self;
相反,在塞古里。 這會解決你的問題嗎? 如果您需要幫助設置代表,請告訴我,我會盡力幫助您!
只需將一個委托添加到您正在訪問該委托的ViewController上,之后XCode / Obj-C似乎做了正確的事情。
之前:
@interface ViewController2 : UIViewController
@end
后:
@interface ViewController2 : UIViewController
@property (nonatomic, weak) id <UIPageViewControllerDelegate> delegate;
@end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.