Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
从不同视图访问iphone全局变量_Iphone_Variables_Global - Fatal编程技术网

从不同视图访问iphone全局变量

从不同视图访问iphone全局变量,iphone,variables,global,Iphone,Variables,Global,好的,所以最终我想要一个程序,用户可以输入简单的数据,比如他们的姓名、出生日期、地址等,然后通过多个视图保存这些信息。我让用户以UITextFields的形式输入他们的信息,但他们使用的是多个视图来输入数据。当用户在UITextField中输入数据,然后移动到另一个视图,然后返回到原始视图时,是否有一种方法可以使数据仍在该UITextField中?我认为,由于存在占位符,因此在调用viewController时,必须有一个命令来显示该字段中以前写入的文本 而且,就我的一生而言,我不知道如何保持这

好的,所以最终我想要一个程序,用户可以输入简单的数据,比如他们的姓名、出生日期、地址等,然后通过多个视图保存这些信息。我让用户以UITextFields的形式输入他们的信息,但他们使用的是多个视图来输入数据。当用户在UITextField中输入数据,然后移动到另一个视图,然后返回到原始视图时,是否有一种方法可以使数据仍在该UITextField中?我认为,由于存在占位符,因此在调用viewController时,必须有一个命令来显示该字段中以前写入的文本

而且,就我的一生而言,我不知道如何保持这些变量的全局性。我在多个领域中读到,我应该在AppDelegate中将它们定义为一个简单的:

NSString *userName;
NSString *userDOB;
但是,当用户返回到最初输入它们的位置时,如何将不同视图中UITextFields中的字符串分配给这些变量,然后将它们重新分配给UITextFields

(如果我解释得不连贯,我很抱歉——我有点生疏)

-编辑- 我已经按照下面的链接,但仍然不能弄明白这一点。我尝试使用:

NSString *name = [[NSUserDefaults standardUserDefaults]objectForKey:@"name"];
[[NSUserDefaults standardUserDefaults]setObject:@“Horace”forKey:@“name”]


但我不能在正确的地方使用它们。我在哪里使用这些命令?如果我让用户在“ViewController1”中输入变量,我应该把这些命令放在“ViewController1.m”文件的某个地方吗?就我个人而言,我无法理解这一点。

我想你这里有两个问题:

  • 如何在视图中保存数据,以便在返回视图时数据仍然存在
  • 如何存储数据,以便所有视图都可以共享数据
  • 第一个问题我想我能很容易回答。如果每个视图有一个控制器,这是推荐的做法。通常情况下,您会在该视图上拥有通过IBOutlet将UITextFields链接到的属性。在手动清除或从内存中擦除视图之前,不会清除该数据。所以你不必担心龚如心会回到另一个视角。您的数据将被保留

    第二个问题更难,因为有很多方法。我自己在这个问题上没有太多经验,但以下是我看到的备选方案:

    • 您可以在谈论时使用globals
    • 如果数据足够复杂,您也可以使用核心数据
    • 您可以创建应用程序委托的属性。UIApplication上有一个静态方法,您可以从任何地方调用该方法以获取对委托的引用

    您可以参考前面的一篇文章
    [NSUserDefaults standardUserDefaults]
    是一个选项。

    应用程序委派或NSUserDefaults都是全局值的好选项,具体取决于您使用它们的方式以及访问它们的频率。您可以重载此方法以获得所需内容:

    -(无效)视图显示:(BOOL)动画

    例如:

    -(void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        MyProjectAppDelegate* appDelegate = (MyProjectAppDelegate*)[[UIApplication sharedApplication] delegate];
        userNameTextField.text = appDelegate.userName;
        userDOBTextField.text = appDelegate.userDOB;
    }
    
    当此视图出现时,它将从应用程序委托加载值


    第二个选项是保留对视图控制器的引用,可能再次在应用程序委托中。然后,每当您想要在视图之间移动时,只要根据需要添加和删除视图即可。不要每次都分配/初始化它,只分配第一个。

    如果我取消分配每个viewController底部的变量,这是否意味着当我移动到另一个视图时,它们会立即取消分配?如果在视图中移动时实际存储了它们,如何使它们显示在用户已键入的UITextFields中?例如,如果提示他们输入姓名并键入“Jim”,然后移动到另一个视图,当他们返回时,该UITextField通常与提示时一样为空-当他们返回到该视图时,如何将“Jim”放置在该字段中?只有当该视图从内存中清除时,才会发生解除锁定。因此,视图的属性将被保留。如果正在清除textfield,则可能是导致视图从内存中卸载,或者您在其他地方有一些代码正在清除该字段。对不起,但我真的没有经验能够准确地指出问题所在。我自己仍在学习:-)好的,这是有道理的-但我如何知道视图何时从记忆中清除?我们不解除锁定ViewController或任何东西,因此如何知道何时清除视图?我注意到,如果我停止释放视图底部的变量,当我向前移动到一个新视图然后返回时,它将保留信息,但如果我向后移动然后再次向前移动,则不会。这有意义吗?