我有3个视图控制器A,B,C ..我想将数据从A传递给C ...我知道我必须在C中创建一个属性并在A中使用它。
但是我不知道为什么..在A中设置值后我仍然在视图C中得到一个空值。
根据给定的建议,我创建了一个新项目和一个新代码...... 我想要实现的是简单的从视图A我希望在视图C ..中传递一个值,但目前它给出了null ..
我的观点1.h档案......
@interface ViewController : UIViewController
- (IBAction)ActionButton:(id)sender;
@end
查看1.m文件..
#import "ViewController.h"
#import "ViewController3.h"
#import "ViewController2.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)ActionButton:(id)sender {
ViewController3 *v3 = [[ViewController3 alloc]init];
v3.string = @"String";
// [self.view addSubview:v3.view];
ViewController2 *v2 = [[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil ];
[self.view addSubview:v2.view];
}
@end
查看2.h文件...
@interface ViewController2 : UIViewController
- (IBAction)ActionButton:(id)sender;
@property (nonatomic,retain) NSString *string1;
@end
查看2.m文件
#import "ViewController2.h"
#import "ViewController3.h"
@interface ViewController2 ()
@end
@implementation ViewController2
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)ActionButton:(id)sender {
ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ];
[self.view addSubview:v3.view];
}
@end
查看3.h文件..
@interface ViewController3 : UIViewController
@property(nonatomic,retain) NSString *string;
@end
并查看3.m文件...
#import "ViewController3.h"
@interface ViewController3 ()
@end
@implementation ViewController3
@synthesize string;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"%@",string);
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
如果我删除了view1中的注释代码,我会在视图3中获取值,但这会改变我不想要的序列...
答案 0 :(得分:3)
创建新答案,因为修改后的问题可以更清晰地解决问题。
在view1.m中,您可以执行以下操作
ViewController3 *v3 = [[ViewController3 alloc]init];
v3.string = @"String";
创建ViewController3的新实例并设置属性值。
然后在view2.m中你做
- (IBAction)ActionButton:(id)sender {
ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ];
[self.view addSubview:v3.view];
}
创建ViewController3的另一个新实例(这次是使用nib布局),但是你没有设置属性值。
您所做的是创建同一对象的2个不同实例,但只设置其中一个的属性值 - 您未显示的属性值。
在ViewController2的ActionButton方法中设置ViewController3的属性值,或者需要将ViewController3的实例传递给ViewController2,然后添加该视图中的子视图。
答案 1 :(得分:0)
尝试按照以下方式打印:
NSLog(@"Type %@",self.WithdrawType);
如果你没有合成它,它将默认合成,如下所示:
@synthesize WithdrawType = _WithdrawType
所以你需要使用自我。访问setter
如果没有,您是否使用相同的控制器?
另请尝试:
Denomination *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil];
答案 2 :(得分:0)
听起来像是执行问题的顺序。如果我不得不猜测控制器C中的 - (id)viewDidLoad方法是在deno.WithdrawType = @“ATM”之前执行的;在控制器A中。
尝试设置一些断点或将NSLog语句从viewDidLoad移动到viewWillAppear以查看是否解决了这个问题。对于解决方案,您可以创建 - (id)initWithWithdrawType:(NSString *)withdrawType方法来初始化视图控制器并确保控制数据流。
警惕viewDidLoad可能会在你的新方法中执行self = [super init]时运行,所以首先设置属性值。
答案 3 :(得分:-2)
你需要
@property (retain,nonatomic) NSString *WithdrawType;
在.m类中合成该属性。