在函数之间传递后数据丢失

时间:2013-12-16 06:24:21

标签: ios objective-c

我在这里遇到有关NSDictionary数据丢失的问题(或者我试图在视图控制器之间传递的任何数据类型)。我正在传递数据,因为我将在下面的代码中显示。但是在传递然后再次访问数据之后,我收到了一个null对象。

FirstViewController.m

-(void)showSecondViewController{
  SecondViewController *secondVC = [SecondViewController new];
  NSMutableDictionary *passedData = [[NSMutableDictionary alloc]init];
  [passedData setObject:@"First Object" forKey:@"first_obj"];
  [passedData setObject:@"Second Object" forKey:@"second_obj"];
  [secondVC setData:passedData];
  [self performSegueWithIdentifier:@"SecondViewControllerSegue" sender:self];
}

在我的SecondViewController.h

 @interface SecondViewController : UIViewController
{
   NSDictionary *passedDataContainer;
}

-(void)setData(NSDictionary *)data;

SecondViewController.m

-(void)setData(NSDictionary *)data{
   passedDataContainer = data;
}

由此我假设我的NSDictionary来自我的FirstViewController,但是当我使用它时,例如说...

-(void)usePassedData{
  NSLog(@"Display Passed Data from FirstViewController: %@",passedDataContainer);
}

在此代码段中,输出将为

Display Passed Data from FirstViewController: (null)

我希望我已经很好地解释了这个案子。我已经检查了一些可能的修复,我在这里找到了SO,例如,这篇文章---> iOS NSDictionary pass through function。如果我知道这是什么原因我会很高兴,我是Objective-C的新手。

P.S。我正在使用ARC。

感谢。

4 个答案:

答案 0 :(得分:0)

如果你想将数据从secondviewcontroller传递给第一个视图控制器,那么你可以使用CUSTOM DELEGATE,使用custome委托你可以将数据从secondviewcintroller传递给firstviewcontroller。

This链接可能对您有所帮助。 这是second链接以了解委托。

答案 1 :(得分:0)

有很多方法可以实现您的解决方案。

  
      
  1. NSUserDefaults的。
  2.   
  3. 代表(自定义)。
  4.   

对于您的问题:Use the @PRoperty (Strong) reference to the NSDictionary and refer it from FirstViewController with the proper alloc of instance of SecondViewController.

答案 2 :(得分:0)

尝试这样,希望这有助于你:)

SecondViewController.h中的


 @interface SecondViewController : UIViewController
 {
   NSDictionary *passedDataContainer;
 }

@property (nonatomic, retain) NSDictionary *data;


并在SecondViewController.m


   @synthesize data; //just synthesize it


和您的FirstViewController.m


-(void)showSecondViewController{
 SecondViewController *secondVC = [SecondViewController new];
 NSMutableDictionary *passedData = [[NSMutableDictionary alloc]init];
 [passedData setObject:@"First Object" forKey:@"first_obj"];
 [passedData setObject:@"Second Object" forKey:@"second_obj"];
  secondVC.data = passedData; //[secondVC setData:passedData];//change this
 [self performSegueWithIdentifier:@"SecondViewControllerSegue" sender:self];
}


答案 3 :(得分:0)

表示您的解释,您正在使用storyboard segueFirstViewController转换为SecondViewController。您需要使用prepareForSegue方法而不是showSecondViewController方法传递数据。

试试这个

FirstViewController.m

-(void)showSecondViewController{

  [self performSegueWithIdentifier:@"SecondViewControllerSegue" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     if ([segue.identifier isEqualToString:@"SecondViewControllerSegue"]){
     NSMutableDictionary *passedData = [[NSMutableDictionary alloc]init];
     [passedData setObject:@"First Object" forKey:@"first_obj"];
     [passedData setObject:@"Second Object" forKey:@"second_obj"];

     SecondViewController *secondVC = (SecondViewController *)segue.destinationViewController;
    [secondVC setData:passedData];
}

SecondViewController.h

@property(strong, nonatomic) NSDictionary *data;

SecondViewController.m

-(void)usePassedData{
  NSLog(@"Display Passed Data from FirstViewController: %@",data);
}