簡體   English   中英

iOS-如何在通過手動Segue鏈接的兩個視圖控制器之間傳遞信息?

[英]iOS - How can I pass information between two view Controllers linked through a Manual Segue?

iOS-如何在通過手動Segue鏈接的兩個視圖控制器之間傳遞信息?

我有兩個視圖控制器,分別在情節提要中分配給了各自的視圖。 我按住Control鍵並單擊,然后從另一個拖動到另一個,然后選擇一個“手動”“推”序列。

據我了解,我可以在代碼中的任何位置執行此segue表單,方法是為其指定一個標識符並使​​用:

performSegueWithIdentifier:@“ identifierA”發送者:自我

將有關所選內容的信息發送到新創建的View Controller的最佳方法是什么?

每當執行segue時,此方法- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender通知控制器即將執行segue。

因此,通過此方法,您可以了解目標視圖控制器,並且可以將任何屬性/傳遞值設置為目標視圖控制器的任何屬性。

這樣的事情。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    if([segue.identifier isEqualToString:@"yourIdentifier"] ){
        YOUR_Destination_Controller *vc = (YOUR_Destination_Controller *)  segue.destinationViewController;
        vc.someProperty = YES;   //in example someProperty is a BOOL 
     }
      else {
        //Do whatever accordingly

     }


}

希望這可以幫助

我對你的問題有些困惑。

假設您有打開VC2的VC1。

如果要將信息從根控制器(vc1)傳遞到新控制器(vc2)

使用segues最好的方法是在VC2中創建公共屬性,並在方法執行之前進行設置。 您可以在prepareForSegue方法中方法執行之前附加。 因此,實現將如下所示:

//
//  VC1.m
//  StackOverflow

#import "VC1.h"
#import "VC2.h"

@implementation VC1



-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"yourSegueId"] )
    {
        if( [segue.destinationViewController isKindOfClass:[VC2 class]] )
        {
            [(VC2*)segue.destinationViewController setMyPassedString:@"YOUR STRING FROM VC1"];
        }
    }
}

@end

//
//  VC2.h
//  StackOverflow

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

@property(nonatomic, strong) NSString* myPassedString;

@end

我個人不喜歡這種方法,因為您是在VC2上創建公共屬性的,可能根本不需要。 但是,這是對情節提要板工作方式的限制,唯一避免這種情況的方法是使用老式的xib和指定的初始值設定項來放置參數。

如果要將信息從新控制器(vc2)傳遞回根(vc1)

在這里,您基本上可以使用兩種方法:通過將弱引用傳遞給vc2,進行存儲,然后在需要時使用它來更新vc1上的內容。 這稱為委托模式,但是它可以以更強大,更封裝的方式使用,稱為BLOCKS

這是帶有塊的簡單實現:

//
//  VC2.h
//  StackOverflow

#import <UIKit/UIKit.h>

@interface VC2 : UIViewController

@property(nonatomic, copy) void(^vc1UpdateBlock)(NSString* string);

@end


//
//  VC2.m
//  StackOverflow

#import "VC2.h"

@implementation VC2

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    _vc1UpdateBlock(@"PUT YOUR PASSED STRING HERE");
}

@end

//
//  VC1.m
//  StackOverflow

#import "VC1.h"
#import "VC2.h"

@implementation VC1



 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if( [segue.identifier isEqualToString:@"yourSegueId"] )
    {
        if( [segue.destinationViewController isKindOfClass:[VC2 class]] )
        {
            [(VC2*)segue.destinationViewController setVc1UpdateBlock:^(NSString * stringFromVC2) {

                NSLog(@"I'm printing in VC1 string %@, passed from VC2", stringFromVC2);

            }];
        }
    }
}

@end

同樣,如果直接使用xib文件,則可以使用指定的初始化程序並隱藏圖塊屬性,但是對於情節提要,您必須創建可公開使用的圖塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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