在视图控制器之间传递数据ios 7

时间:2013-10-21 09:44:38

标签: iphone ios objective-c uiviewcontroller ios7

我正在开发应用程序,我需要在视图控制器之间传递数据。我知道这是一个常见问题,但我无法找到问题的答案:我能够将数据从FirstViewController(在我的情况下为MasterViewController)传递到SecondViewController({{1而不是反过来。会发生什么是我从SecondViewController.m文件中的FirstViewController调用一个方法。这可以工作并记录数据。但是当我退出SecondViewController(使用SettingsViewController)时,数据被重置。 我尝试使用其他方法传递数据,但它不起作用。我正在使用此代码传递数据:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

我也尝试用MasterViewController *vc = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil]; [vc setPorts:SelectedPorts]; 替换[vc setPorts:SelectedPorts];,但也会出现同样的问题。

vc.selectedCellIndexes = SelectedPorts;方法在FirstViewController.h文件中声明,setPorts是我在SecondViewController.m中声明的变量(我没有检查过它。)

以下是 FirstViewController.m 中的SelectedPorts

setPorts:

这会记录好的值但是当我在FirstViewController.m中的- (void) setPorts:(id)selectedPorts { selectedCellIndexes = selectedPorts; NSLog(@"selectedCellIndexes : %@", selectedCellIndexes); } 中记录它时,它会重置为我从SecondViewController.m调用该方法之前的值。

请注意,如果我不退出 SecondViewController.m ,数据不会重置。

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

感谢您的帮助。

6 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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内修改列表后,即使您离开MasterViewControllerSettingsViewController中包含的端口列表也不会移动。

答案 2 :(得分:0)

获得结果没有什么不寻常之处。通过做

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

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

不要创建新实例,只需在属性中保存MasterViewControllerSecondViewController的引用,然后在移动到第二个VC之前分配它。作为初学者,我建议这样做。但是使用委托是将数据传回的优先方式。

答案 3 :(得分:0)

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

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

在主VC中使用展开segue,只需执行以下操作:

-(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];

答案 4 :(得分:0)

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

您需要使用委托方法。检查我的答案SO.

答案 5 :(得分:0)

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

根据您的理解,您需要从“SecondViewController”到“FirstViewController”的反向值

不要在SecondViewController中创建FirstViewController的新对象,它将无效。

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

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

  3. 如果要将反向值传递给FirstViewController,则在SecondViewController.m文件中。 [self.firstViewController setPorts:SelectedPorts];

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

  5. 尝试上面的代码将根据您的要求正确地工作。