Ios 在没有分段的视图控制器之间传递数据

Ios 在没有分段的视图控制器之间传递数据,ios,uiviewcontroller,Ios,Uiviewcontroller,我使用的是故事板,我有一个加载动态按钮的视图。单击此按钮时,我需要加载第二个视图控制器并传递数据。我不能使用segue作为其动态按钮 我使用以下代码加载第二个视图控制器 UIStoryboard* sb1 = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; UIViewControll

我使用的是故事板,我有一个加载动态按钮的视图。单击此按钮时,我需要加载第二个视图控制器并传递数据。我不能使用segue作为其动态按钮

我使用以下代码加载第二个视图控制器

UIStoryboard*  sb1 = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
                                                           bundle:nil];
UIViewController* vc1 = [sb1 instantiateViewControllerWithIdentifier:@"SecondViewController"];


[self.navigationController pushViewController:vc1 animated:YES];

在第二视图控制器中,我需要从第一视图控制器访问大约5个字段。如何传递数据?

尝试以下方法:

甲级

// CLASS_A.h
#import <UIKit/UIKit.h>
@interface CLASS_A : UIViewController {
    ...
}
- (IBAction)Btn_PushPressed:(id)sender;
...
@end

// CLASS_A.m
#import "CLASS_A.h"
#import "CLASS_B.h"
@implementation CLASS_A

- (IBAction)Btn_PushPressed:(id)sender
{
    UIStoryboard*  sb1 = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
                                                       bundle:nil];
    CLASS_B* vc1 = [sb1 instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc1.delegate = self;
    [self.navigationController pushViewController:vc1 animated:TRUE];
}

....
@end
//类A.h
#进口
@接口类_A:UIViewController{
...
}
-(iAction)Btn_按钮按下:(id)发送方;
...
@结束
//上午九时三十分
#导入“A.h类”
#导入“B.h类”
@实现类_A
-(iAction)Btn_按钮按下:(id)发送方
{
UIStoryboard*sb1=[UIStoryboard情节提要,名称:@“MainstryBoard\u iPhone”
束:零];
CLASS_B*vc1=[sb1实例化ViewController的标识符:@“SecondViewController”];
vc1.delegate=self;
[self.navigationController pushViewController:vc1已设置动画:TRUE];
}
....
@结束
B类

// CLASS_B.h
#import <UIKit/UIKit.h>
@class CLASS_A;
@interface CLASS_B : UIViewController {
    ...
}
@property (weak, nonatomic) CLASS_A *delegate;
....
@end

// CLASS_B.m
#import "CLASS_B.h"
#import "CLASS_A.h"
@implementation CLASS_B
....
@end
//CLASS_B.h
#进口
@A类;
@接口类_B:UIViewController{
...
}
@属性(弱、非原子)类_A*委托;
....
@结束
//B.m级
#导入“B.h类”
#导入“A.h类”
@实现类_B
....
@结束

首先,即使您有动态按钮,也可以使用segue,只需将目标方法添加到UIButtons中,然后在该方法中使用segue按下view controller。在第二个视图控制器中,在推送第二个视图控制器之前,获取一些属性并为这些属性指定值。比如:

UIStoryboard*  sb1 = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
                                               bundle:nil];
UIViewController* vc2 = [sb1 instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc2 setName:@"name"];
[self.navigationController pushViewController:vc2 animated:YES];

在此之前,您需要将属性指定给SecondViewController中的NSString*名称

,您可以通过按住ctrl键并将其从第一个控制器拖动到第二个控制器来创建一个未绑定到按钮的序列(别忘了指定此序列和标识符)

NSData * aData = [[NSUserDefaults standardUserDefaults] valueForKey:@"DATA"];
接下来,在按钮的iAction(通过Interface Builder或通过
addTarget:self action:forControlEvents:
)设置)中,您可以调用
[self-PerformsgueWithIdentifier:@“YourSegueIdentifier”发送者:按钮]


您可以像往常一样,在
-(void)prepareforsgue:(UIStoryboardSegue*)segue sender:(id)sender中将数据传递给第二个控制器,您可以定义一个协议:PassValueDelegate,并且在第一个viewController中可以实现该协议

UIStoryboard*  sb1 = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
UIViewController* vc1 = [sb1 instantiateViewControllerWithIdentifier:@"SecondViewController"];
//set the delegate for the second view controller,so you can access the values in the first controller
vc1.delegate = self;
[self.navigationController pushViewController:vc1 animated:YES];

这是如何在Swift 2.0中实现的。而不是使用
prepareforsgue

Swift 3.0

Swift 2.0

斯威夫特3

let destinationView = self.storyboard?.instantiateViewController(withIdentifier: "ID") as! ViewController2
destinationView.Value2 = Value1
self.present(destinationView, animated: true, completion: nil)
你可以简单地使用

NSUserDefaults

存储数据并在需要的页面中检索

视图控制器A

[[NSUserDefaults standardUserDefaults] setObject:aData forKey:@"DATA"];
[[NSUserDefaults standardUserDefaults] synchronize];
目的地控制器内

NSData * aData = [[NSUserDefaults standardUserDefaults] valueForKey:@"DATA"];

为什么不在按下新的viewcontroller之前设置所需的信息呢?你已经有了VC的实例。将属性公开(在标题中声明)或创建新属性以填充您的数据。我添加了更多注释,请检查swift 3如何?将添加swift 3.0@Maven;)在这里@Maven“someObject”显示为不是someViewController的成员。我没有完全使用你的代码<代码>var someViewController=mainStoryboard.instanceeviewcontroller(带有标识符:“listView”)为!ListVC
。这就是我正在使用的代码。有什么问题吗?@Maven someObject只是一个示例,它向您展示了如何在
ViewController
之间无分段地传递对象。你想通过哪个物体?只需将其替换为
someObject
NSData * aData = [[NSUserDefaults standardUserDefaults] valueForKey:@"DATA"];