在Objective-C中将一个ViewController中的值传递给另一个ViewController

时间:2013-11-28 13:23:33

标签: ios objective-c

我对Objective-C编程很新。我现在忍受的一件事是将值从第一个ViewController传递到下一个{。

我读过this entry here但它对我没有帮助。这很有趣,因为他的回答有近500票,所以我一定是问题所在。我做的是以下。

我打开了PreviewViewController.m并添加了以下行#import "MainViewController.h",因为我想将PreviewViewController中的值传递给`MainViewController。然后,当我切换布局(成功地工作)时,我想传递一个值。

MainViewController  *mainViewController     = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
mainViewController.userId                   = @"539897197";

如您所见,我想传递userId。为此,我还在MainViewController.h

中创建了一个属性
@property ( nonatomic, strong ) NSString *userId;

现在,在我的MainViewController.m我想访问userId。但是当我记录它时,控制台告诉我它是null。但是,当我在NSLog工作之前设置变量时,似乎传递就是问题。

另外在MainViewController.m我有以下一行

@synthesize userId = _userId; 

但即使我删除该行并将NSLog更改为NSLog(@"%@",self.userId);,也会出现同样的问题。

如何成功传递变量?我做错了哪一步?

修改 这是我切换布局的方式

UIViewController    *viewController         = [[MainViewController alloc]init];
MainViewController  *mainViewController     = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
mainViewController.userId                   = @"539897197";
[self presentViewController:viewController animated:YES completion:NULL];

5 个答案:

答案 0 :(得分:1)

为什么不创建自定义初始化程序并以这种方式传递它?像

这样的东西
- (id)initWithUserId:(NSString *)aUserId {
    self = [super initWithNibName:@"MainViewController" bundle:nil];
    if (self) {
        self.userId = aUserId
    }
    return self;
}

然后你可以这样做:

MainViewController *mvc = [[MainViewController alloc] initWithUserId:@"1234"]
[self presentViewController:mvc animated:YES completion:nil];

答案 1 :(得分:0)

如果您使用storyboard,则应使用prepareForSegue:方法在视图控制器之间传递数据。首先从PreviewViewControllerMainViewController创建segue,只需控制从视图控制器拖动到下一个viewcontroller以创建segue。如果您使用push segue,请使用UINavigationController。使用此方法来隔离和传递数据

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"yourSegueIndentifier"]){
        MainViewController *mvc = (MainViewController *) segue.destinationViewController;
        mvc.userId  = @"539897197";;
    }
}

答案 2 :(得分:0)

UIViewController    *viewController         = [[MainViewController alloc]init];
MainViewController  *mainViewController     = [[MainViewController    alloc] initWithNibName:@"MainViewController" bundle:nil];
mainViewController.userId = @"539897197";
[self presentViewController:mainViewController animated:YES completion:NULL];

在呈现视图控制器时使用mainViewController而不是viewController

答案 3 :(得分:0)

这里有两种传递数据的方法。

首先是自定义代表

其次是NSNotification

这里我们有两个视图控制器。

的ViewController 和 SecondViewController

在SecondViewController中

·H

#import <UIKit/UIKit.h>
@class SecondViewController;
@protocol SecondViewControllerDelegate <NSObject>
- (void)secondViewController:(SecondViewController *)secondViewController didEnterText:(NSString *)text;
@end
@interface SecondViewController : UIViewController
@property (nonatomic, assign)id<SecondViewControllerDelegate> delegate;  
@property (nonatomic, strong) IBOutlet UITextField *nameTextField;//It must connect as outlet connection
- (IBAction)doneButtonTapped:(id)sender;
@end

的.m

#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController

- (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.
}

//Either use NSNotification or Delegate
- (IBAction)doneButtonTapped:(id)sender;
{
          //Use Notification
     [[NSNotificationCenter defaultCenter] postNotificationName:@"passingDataFromSecondViewToFirstView" object:self.nameTextField.text];
          //OR Custom Delegate
     [self.delegate secondViewController:self didEnterText:self.nameTextField.text];
     [self.navigationController popViewControllerAnimated:YES];
}
- (void)didReceiveMemoryWarning
{
      [super didReceiveMemoryWarning];
      // Dispose of any resources that can be recreated.
}
ViewController中的

·H

#import <UIKit/UIKit.h>
#import "SecondViewController.h"
@interface ViewController : UIViewController<SecondViewControllerDelegate>
@property (nonatomic, strong) IBOutlet UILabel *labelName; //You must connect the label with outlet connection
- (IBAction)gotoNextView:(id)sender;
@end

的.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
   [super viewDidLoad];
   //addObserver here...
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFromPreviousViewControllerNotificationReceived:) name:@"passingDataFromSecondViewToFirstView" object:nil];
   // Do any additional setup after loading the view, typically from a nib.
}

//addObserver Method here....
- (void)textFromPreviousViewControllerNotificationReceived:(NSNotification *)notification
{
   // set text to label...
   NSString *string = [notification object];
   self.labelName.text = string;
}
- (IBAction)gotoNextView:(id)sender;
{
   //If you use storyboard
   SecondViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
   //OR  If you use XIB
   SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
   secondViewController.delegate = self;
   [self.navigationController pushViewController:secondViewController animated:YES];
}

//Calling custom delegate method
- (void)secondViewController:(SecondViewController *)secondViewController didEnterText:(NSString *)text
{
   self.labelName.text = text; //Getting the data and assign the data to label here.
}

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

为了理解代码,我创建了一个从第二个视图控制器到第一个视图控制器的简单传递数据。

首先,我们将视图从第一个视图控制器导航到第二个视图控制器。

之后,我们将数据从第二个视图控制器发送到第一个视图控制器。

注意:您可以使用NSNotification或自定义委派方法将数据从One View Controller发送到其他视图控制器

如果您使用NSNotification,则需要设置 postNotificationName 以获取按钮操作方法中的数据。

接下来,您需要编写 addObserver (将数据发送到所需的View Controller)ViewController并在同一个View Controller中调用addObserver方法。

如果您使用自定义委托,  通常我们选择自定义协议代理,我们还需要分配代表。

非常重要的是,我们必须在第二视图控制器中设置自定义委托方法。因为我们在单击完成按钮后将数据发送到第一个视图控制器的位置第二视图控制器。

最后,我们必须在第一个视图控制器中调用自定义委派方法,在那里我们获取数据并将该数据分配给label.Now您可以使用查看传递的数据自定义代表。

同样,您可以使用自定义委托方法

将数据发送到其他视图控制器

答案 4 :(得分:-1)

我试过并获得了在viewcontroller之间传递值的解决方案。

MainViewController *mainVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"MainViewController"];    
mainVC.userId = @"539897197"; 
[self presentViewController:mainVC animated:YES completion:Nil];

或使用这种方式。你没有使用故事板使用以下工作正常

MainViewController *mainVC = [[MainViewController alloc] init];    
mainVC.userId = @"539897197"; 
[self presentViewController:mainVC animated:YES completion:Nil];