簡體   English   中英

在prepareForSegue中傳遞對ViewController的引用

[英]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或了解其他任何內容。

更多詳情...

  1. 這是你的正確形式

     @property (strong, nonatomic) ViewController1 *vc1Reference; 

    注意使用weak引用。 您不希望strong引用,因為您不想與委托有任何關系,除非知道它可以處理您在協議中指定的方法。 委托通常是創建委托者的對象,在另一個方向上創建strong引用會導致內存泄漏,因為這兩個對象都不會存在。

  2. 這是你的行的正確形式:

     vc2.vc1Reference = (ViewController1*)segue.sourceViewController; 

    請注意,我們不使用1或2中的類型/強制轉換。為了最大限度地重用代碼/解耦,我們不希望對segue任何一端的對象類型做出任何假設。 我假設你的'prepareForSegue'在vc1中。 如果不是那么該行看起來像這樣:

     vc2.delegate = segue.sourceViewController 
  3. 這是協議聲明。 它位於vc2的頭文件中。 vc2正在發布它對任何選擇成為其委托的對象的期望。 vc2將根據此協議發送消息,因此任何委托都需要以正確的方式響應。 您可以使用這種消息傳遞來防止vc2中的故障

     if (self.delegate respondsToSelector:@selector('delegateMethod') { [self.delegate delegateMethod]; } 

    (這是您在vc2中用於與vc1進行通信的消息傳遞類型的示例。如果需要,您可以顯然傳遞參數並返回返回的結果)

  4. 這是編譯器的幫助程序,如果您未能實現協議,它可以向您發出警告。

    最后在對象定義的某處,您需要實現該方法:

     - (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM