-1

我之前发布了一个关于同一件事的问题,但现在我做了一个简单的项目来展示我在做什么,这样可以更容易地找到问题。

我有两个 viewController,一个叫做 ViewController,另一个叫做 SecondViewController。我尝试将一个名为 testy 的 NSString 发送到 viewController 并记录它,但它返回 null。

这是我的代码尝试将字符串从 viewController 发送到 secondViewController

视图控制器.m

#import "ViewController.h"

#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize cellName;

- (void)viewDidLoad
{
    [super viewDidLoad];

    cellName = @"testy";

    SecondViewController *obj = [[SecondViewController alloc] init];

    obj.cellName2 = self.cellName;    
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {

}
@property(nonatomic,retain) NSString *cellName;

@end

第二视图控制器.m

#import "SecondViewController.h"

#import "ViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

@synthesize cellName2;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void)viewDidAppear:(BOOL)animated {
NSLog(@"%@",cellName2);

}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController {

}

@property(nonatomic,retain) NSString *cellName2;

@end

编辑

我想说我的故事板有两个 viewController,每个都有一个按钮。每个按钮以模态方式将您带到另一个视图。

4

5 回答 5

2

您确定正在调用 viewDidLoad 吗?我认为在加载视图之前不会调用它。我不认为它是在 alloc init 之后调用的。您还在初始化后在 obj 2 中设置字符串。即使您的想法是正确的,也可能会在设置字符串之前调用“viewDidLoad”方法。

如果你想在 init 上设置一个变量,你需要将 viewController 2 的 init 方法覆盖为类似 initWithMyVariable 的东西,那么 var 将在 init 上设置。

来自:在视图控制器之间传递数据

将数据从另一个视图控制器转发到视图控制器。如果你想将一个对象/值从一个视图控制器传递到另一个视图控制器,你可能会使用这个方法,你可能会推送到导航堆栈。

对于这个例子,我们将有 ViewControllerA 和 ViewControllerB

要将 BOOL 值从 ViewControllerA 传递给 ViewControllerB,我们将执行以下操作。

在 ViewControllerB.h 中为 BOOL 创建一个属性

@property(nonatomic) BOOL *isSomethingEnabled;

在 ViewControllerA 你需要告诉它 ViewControllerB 所以使用

导入“ViewControllerB.h”

然后您要加载视图的位置,例如。didSelectRowAtIndex 或一些 IBAction 您需要在 ViewControllerB 中设置属性,然后再将其推送到导航堆栈。

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil];
viewControllerB.isSomethingEnabled = YES;
[self pushViewController:viewControllerB animated:YES];

这会将 ViewControllerB 中的 isSomethingEnabled 设置为 BOOL 值 YES。

于 2013-08-13T20:53:51.407 回答
1

对于所有阅读本文的人来说,提及在两个视图之间传递变量的工作模式可能是值得的:

选项:

  1. 使用全局变量:所以回答
  2. 使用委托模式:所以回答
  3. 使用通知基础设施:文章
  4. 将值保留在应用程序的用户默认存储中,然后在需要时读取:所以回答

对于这种特殊情况,最好不要在 firstviewcontroller 的 viewdidload 中创建 secondviewcontroller,而是保留 cellName 直到发生用户操作(例如,按下按钮),然后在该方法中您只需设置新创建的 secondviewcontroller 的 cellName2 属性.

SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"second" bundle:nil];
secondViewController.cellName = self.cellName;

我已经测试过,它正确地将值记录在 secondviewcontroller 的 viewdidload 中。

于 2013-08-13T21:05:53.357 回答
0

- 为第二个视图控制器创建一个初始化方法以传递变量..

在 secondview 控制器 .h 文件中

添加初始化方法

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil cellString(NSString* )cellName;

和 .m 文件

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil cellString(NSString* )cellName{

   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

     if (self) {

        // Custom initialization
     cellName2=cellName;

     }
     return self;

}

并在 ViewController.m 中进行初始化

SecondViewController *obj = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil cellString:self.cellName];

这应该工作......祝你好运

于 2013-08-13T21:21:08.047 回答
0

而不是这样做: cellName = @"testy"; 您应该致电:

 self.cellName = @"testy";

alloc此外,当您init在:

SecondViewController *obj = [[SecondViewController alloc] init];,当时viewDidLoad()就调用了 for secondViewController 并且您稍后在该行中将其初始化为 iVarobj.cellName2 = self.cellName;

这就是为什么您将 NSLOG 设为空的原因。

在 secondViewController 的 viewWillAppear() 中打印 NSLOG,这次你会看到正确的值。

于 2013-08-13T20:46:53.630 回答
-1

在 viewcontroller.m 中,viewDidLoad 中有以下内容:

..
..
SecondViewController *obj = [[SecondViewController alloc] init];
obj.cellName2 = self.cellName;    
}

SecondViewController "obj" 在 vi​​ewDidLoad 结束之前永远不会出现,因此 NSLog 打印为空。

如果您想通过情节提要将值传递给 SecondViewController,则需要使用prepareForSegue方法。使用它的一个很好的例子可以在这里找到。

于 2013-08-13T21:11:17.670 回答