【问题标题】:Passing data from one view controller to other giving null [duplicate]将数据从一个视图控制器传递到另一个给出 null [重复]
【发布时间】:2013-07-05 19:53:56
【问题描述】:

我有 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 中获得值,但这会改变我不想要的序列...

【问题讨论】:

  • 尝试改变 (retain,nonatomic) NSString *WithdrawType; to (strong, nonatomic) NSString *WithdrawType;
  • 您是否忘记在 .m 文件中 synthesize 您的属性?
  • 不,将属性更改为 strong 并没有帮助......而且@HRM 我已经在 .m 文件中合成了属性
  • 你确定你在调用 NSLog 时在同一个 C 控制器实例中吗?
  • Yes OfCourse 我在面额视图中使用它

标签: ios objective-c uiviewcontroller


【解决方案1】:

尝试这样打印:

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

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

@synthesize WithdrawType = _WithdrawType

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

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

也可以试试:

Denomination *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil]; 

【讨论】:

  • 是的......否则它会给出错误......不是吗??
  • 能把你用的代码放上来吗?
  • 我刚刚编辑过,试试看
  • 我已经尝试过self.WithdrawType,仍然是null
  • 现在我只是在 NSLog 中打印...。仅供参考,当我将面额声明更改为此面额 *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil] ;它有效......我不知道为什么
【解决方案2】:

你需要

@property (retain,nonatomic) NSString *WithdrawType;

在 .m 类中综合该属性。

【讨论】:

  • downvoter 为什么不给我投票告诉我有什么问题...
  • 由于不再需要 Xcode 4.4 合成,而是由 llvm 编译器隐式添加。
【解决方案3】:

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

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

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

【讨论】:

  • 即使我使用相同的按钮单击事件,字符串仍然为空
  • 好的,我想我看到了这里发生的一些事情。我要添加一个新的答案。
【解决方案4】:

创建一个新答案,因为修改后的问题使问题更加清晰。

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

【讨论】:

  • 这就是我的想法..但不是一个非常合适的方式....这是否也意味着无法将数据从 view1 传递到 view3 ???
  • 这在很大程度上取决于数据源和应用程序的架构。对于一些简单的事情,您只需将数据从 v1 传递到 v2,然后再传递到 v3。如果 v1 是导航堆栈上的根视图控制器,您可以在 v1 上的属性中设置值,然后使用 (ViewController1 *)[self.navigationController.viewControllers objectAtIndex:0] 从 v3 检索它的实例并获取值从那里的财产。
  • 谢谢你...帮助很大..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多