Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS在离开并返回视图后在视图上保留多个变量_Ios_Objective C - Fatal编程技术网

iOS在离开并返回视图后在视图上保留多个变量

iOS在离开并返回视图后在视图上保留多个变量,ios,objective-c,Ios,Objective C,问这个问题我觉得很无知,因为我知道它很简单。目标:离开后在视图上保留一个变量,然后返回到该变量 例如:假设我们有MainView、CategoryView和(drumroll)ProjectView 应用程序打开到MainView它显示一个表-用户选择他们想要选择的类别。此序列将它们添加到类别视图。选择后,我将所选类别发送回主视图。通过 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 没问题。Mai

问这个问题我觉得很无知,因为我知道它很简单。目标:离开后在视图上保留一个变量,然后返回到该变量

例如:假设我们有MainViewCategoryView和(drumroll)ProjectView

应用程序打开到MainView它显示一个表-用户选择他们想要选择的类别。此序列将它们添加到类别视图。选择后,我将所选类别发送回主视图。通过

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
没问题。MainView接收变量并将所选类别显示为“类别”部分中的子文本。接下来,用户想要选择一个项目名称(这也是一个预定义的列表),他们选择项目,我将变量发送回MainView

--现在有人可以(温和地)向我解释一下,为什么当我返回到主视图时,以前保存“Selected”类别的NSString变量现在为空

所以我的NSString SELECTED项目没有被保留,对吗?我应该在这里执行的正确实现是什么?或者我错过了什么?我真的很想了解发生了什么,所以任何事情都会有很大的帮助

MainView界面

    @interface MainViewController : UIViewController {
        NSString *selectedProjectName;
        NSString *selectedCategory;
    }

    @property (nonatomic, retain) NSString *selectedProjectName;
    @property (nonatomic, retain) NSString *selectedCategory;

    @end
MainView实现

    @implementation MainViewController
    @synthesize selectedCategory, selectedProjectName;
  -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"masterSegue"]) {
    MainViewController *vc = (MainViewController *)[segue destinationViewController];

    LogValues *lv = [LogValues alloc];

    lv.project = @"Test Project Name";
    vc.selectedProjectName = lv.project;
    } 
    }
如果你需要的话。。 项目视图实施

    @implementation MainViewController
    @synthesize selectedCategory, selectedProjectName;
  -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([[segue identifier] isEqualToString:@"masterSegue"]) {
    MainViewController *vc = (MainViewController *)[segue destinationViewController];

    LogValues *lv = [LogValues alloc];

    lv.project = @"Test Project Name";
    vc.selectedProjectName = lv.project;
    } 
    }

因此,当然,在发布之后,我立即看到了一条我认为有帮助的线索。解决方案是将这些值存储在运行正常的AppDelegate中


但是,我觉得有其他方法可以在不依赖AppDelegate的情况下实现相同的结果,我希望听到其他解决方案。

好的,您的问题是您没有返回到相同的实例。关于segues,您错过了一件非常重要的事情——它们总是实例化新的视图控制器。因此,当您使用模态序列“返回”主视图控制器时,您只是在创建该控制器的新实例。在故事板中,除了使用“展开”序列外,您永远不应该后退(到早期的控制器)。展开是关于分段始终创建新实例的规则的例外


所以,你有两个选择。您可以使用展开序列,这很好,因为您仍然可以实现prepareForSegue将数据发送回目标控制器,或者根本不能使用序列,使用DismissViewControllerInitiated:completion:返回,并使用委托发送回数据。

可能是因为您没有“返回”到主视图,您可能正在创建一个新实例。如何“返回”到主视图(什么类型的segue)?返回时,我将segue设置为modalIf。如果您不知道如何进行放松segue,请参见我的答案。太好了,谢谢你的解释。我会研究一下如何使用展开,我还没有听说过。所以,如果这是一种不好的方法,即使它很好用,你介意解释一下更合适的方法吗。这是一个小的内部应用程序,只需要存储8个变量,所以我不认为这样做有什么害处。只是想学最好的。