4

我正在开发一个应用程序,我需要在视图控制器之间传递数据。我知道这是一个常见问题,但我找不到我的问题的答案:我能够将数据从 FirstViewController(MasterViewController在我的情况下)传递到SecondViewController( SettingsViewController),但不能反过来。发生的情况是我从 SecondViewController.m 文件中的 FirstViewController 调用了一个方法。这有效,它记录数据。但是当我退出 SecondViewController(使用[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];)时,数据被重置。我尝试使用其他方法来传递数据,但没有奏效。我正在使用此代码来传递数据:

MasterViewController *vc = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];

[vc setPorts:SelectedPorts];

我也尝试替换[vc setPorts:SelectedPorts];为,vc.selectedCellIndexes = SelectedPorts;但出现同样的问题。

setPorts方法在 FirstViewController.h 文件中声明,并且SelectedPorts是我在 SecondViewController.m 中声明的变量(我检查的不是 nil)。

这是setPorts:FirstViewController.m 中

- (void) setPorts:(id)selectedPorts {
selectedCellIndexes = selectedPorts;
NSLog(@"selectedCellIndexes : %@", selectedCellIndexes);
}

这记录了良好的值,但是当我将其登录viewWillAppear到 FirstViewController.m 时,它会重置为我从 SecondViewController.m 调用该方法之前的值。

只是为了澄清一下,如果我不退出SecondViewController.m,则不会重置数据。

我确实阅读了你所有的评论,我真的很感谢你的帮助。为方便起见,我使用了一个全局变量。

谢谢你的帮助。

4

6 回答 6

1

在 secondViewController 中,您创建协议

  #import <UIKit/UIKit.h>

@protocol sampleDelegate <NSObject>

- (void)passValue:(id)selectedPorts

@end

@interface SecondViewController : UIViewController

@property (nonatomic, strong) id <sampleDelegate> passDelegate;

@end

根据您的需要在 viewDidLoad 或任何方法中,调用这样的方法,

[self.passDelegate passValue:selectedPorts];

在 FirstViewController.h 中,

导入委托<sampleDelegate>

#import "SecondViewController.h"

@interface FirstViewController : UIViewController<SampleDelegate>

@end

在 FirstViewController.m 中,

-(void)passValue:(id)selectedPorts
{
    id receivedValues = selectedPorts;
}

并在您的 SecondViewController 分配中设置 self ,

SecondViewController *vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
vc.passDelegate = self;
于 2013-10-21T09:52:12.323 回答
1
  • 您有一个端口列表,MasterViewController并且您希望在SettingsViewController.
  • 可以保存此MasterViewController列表并且SettingsViewController应该可以访问它。

SettingsViewController中,有一个setSelectedPort方法:

@property (nonatomic, retain) id selectedPorts

- (void) setPorts:(id)selectedPorts;

该方法将选定的端口列表保存到属性中。

MasterViewController中,调用SettingsViewController并给它列表。

SettingsViewController *vc = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
[vc setSelectedPorts:yourValue]; 

当在 中修改SettingsViewController列表时,MasterViewController即使您离开SettingsViewController.

于 2013-10-21T10:08:03.293 回答
0

您正在从第二个视图控制器创建第一个视图控制器的新实例,而不是访问原始调用者的同一实例。这就是为什么当你回到原来的调用者——你的 MasterViewController 时你可以看到日志但数据不存在的原因。

您需要使用委托方法。检查我对这个SO 的回答。

于 2013-10-21T10:09:36.047 回答
0

这是与对象所有权有关的问题。请按照以下步骤操作:

根据理解,您希望将值从“SecondViewController”反转为“FirstViewController”

不要在 SecondViewController 中创建 FirstViewController 的新对象,它不会起作用。

  1. 在“SecondViewController.h”文件中创建“FirstViewController”对象。@property (nonatomic,strong) FirstViewController *firstViewController;

  2. 当您从 FirstViewController 导航到 SecondViewController 时,请传递“self”。例如 SecondViewController *vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; vc.firstViewController = 自我;

  3. 如果您想将反向值传递给 FirstViewController 然后在 SecondViewController.m 文件中。[self.firstViewController setPorts:SelectedPorts];

  4. 并在 FirstViewController.m 中使用最新值刷新您的控件。

尝试上面的代码将完全按照您的要求工作。

于 2013-10-21T10:11:30.337 回答
0

使用委托方法从模态 VC 与主 VC 通信,或者如果您想从模态 VC 检索一些被操纵的对象,您可以执行类似的操作。

将对象设置为模态视图控制器的 .h 文件中的属性(因此它们是公共的)。

在主 VC 中使用 unwind segues,只需执行以下操作:

-(IBAction)exitModalVC:(UIStoryboardSegue*)segue
{
    SomeObject *obj = ((YourModalVC*)segue.sourceViewController).someObject;

    //Do what you want with obj
}

编辑:

这仅在您使用 unwind segue 时才有效(这是在使用故事板时消除模态 VC 的一种巧妙方法)

而你正在使用这个,这不是放松的segues:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
于 2013-10-21T10:04:58.027 回答
0

得到的结果没有什么异常。通过做

MasterViewController *vc = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];   
[vc setPorts:SelectedPorts];

您正在MasterViewController从您的SecondViewController. 这与您导航到SecondViewController. 所以你不会得到预期的结果。由于您将 ports( [vc setPorts:SelectedPorts]) 设置为新创建的 Master 实例。

无需创建新实例,只需将 in 的引用保存MasterViewControllerSecondViewController属性中并在移动到第二个 VC 之前分配它。作为初学者,我建议这种方式。但是使用委托是传回数据的首选方式。

于 2013-10-21T09:59:38.837 回答