1

我有 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

仅供参考,如果我删除视图 1 中的注释代码,我会在视图 3 中得到值,但这会改变我不想要的序列...

4

4 回答 4

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,然后从该实例添加子视图。

于 2013-07-08T14:30:26.087 回答
0

在我看来,这就像一个执行顺序问题。如果我不得不猜测控制器 C 中的 -(id)viewDidLoad 方法在 deno.WithdrawType = @"ATM"; 之前执行 在控制器 A 中。

尝试设置一些断点或将 NSLog 语句从 viewDidLoad 移动到 viewWillAppear 以查看是否可以解决问题。对于一个解决方案,您可能可以创建一个 -(id)initWithWithdrawType:(NSString *)withdrawType 方法来初始化您的视图控制器并确保您正在控制数据流。

请注意,当您在新方法中执行 self = [super init] 时可能会运行 viewDidLoad,因此请先设置属性值。

于 2013-07-08T13:34:35.483 回答
0

尝试像这样打印它:

NSLog(@"Type %@",self.WithdrawType);

如果没有合成,默认合成如下:

@synthesize WithdrawType = _WithdrawType

所以你需要使用自我。访问设置器

如果不是,您是否使用相同的控制器?

也试试:

Denomination *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil]; 
于 2013-07-08T13:04:56.160 回答
-2

你需要

@property (retain,nonatomic) NSString *WithdrawType;

在 .m 类中合成该属性。

于 2013-07-08T13:08:50.467 回答