[英]How can I pass data between two View Controllers in a Navigation Controller, with two Push 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.