我正在开发应用程序,我需要在视图控制器之间传递数据。我知道这是一个常见问题,但我无法找到问题的答案:我能够将数据从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 ,数据不会重置。
我确实阅读了您的所有评论,我非常感谢您的帮助。为方便起见,我使用了一个全局变量。
感谢您的帮助。
答案 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
内修改列表后,即使您离开MasterViewController
,SettingsViewController
中包含的端口列表也不会移动。
答案 2 :(得分:0)
获得结果没有什么不寻常之处。通过做
MasterViewController *vc = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
[vc setPorts:SelectedPorts];
您正在从MasterViewController
创建SecondViewController
的新实例。这与导航到SecondViewController
的情况不同。所以你不会得到预期的结果。由于您要将端口([vc setPorts:SelectedPorts]
)设置为新创建的Master实例。
不要创建新实例,只需在属性中保存MasterViewController
中SecondViewController
的引用,然后在移动到第二个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的新对象,它将无效。
在“SecondViewController.h”文件中创建“FirstViewController”对象。 @property(非原子,强)FirstViewController * firstViewController;
当您从FirstViewController导航到SecondViewController时,请传递“self”。 例如SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@“SecondViewController”bundle:nil]; vc.firstViewController = self;
如果要将反向值传递给FirstViewController,则在SecondViewController.m文件中。 [self.firstViewController setPorts:SelectedPorts];
在FirstViewController.m中使用最新值刷新控件。
尝试上面的代码将根据您的要求正确地工作。