【问题标题】:iOS view controller data sharing setText 'delay'iOS 视图控制器数据共享 setText 'delay'
【发布时间】:2023-03-13 21:14:01
【问题描述】:

我有 2 个视图控制器,其中一个有一个字符串(例如“Text1 Text2”),当按下按钮时会将其保存到默认用户数据:

[[NSUserDefaults standardUserDefaults] setObject:textObject forKey:@"textObjectKey"];

同样的按钮在第二个视图控制器上有一个弹出框表示 segue,它在其viewDidLoad 中检索字符串:

[[NSUserDefaults standardUserDefaults] stringForKey:@"textObjectKey"];

并调用setText 方法到textView 以包含字符串。

这确实有效,但我的问题是当我更改字符串(例如“Text1 Text2 Text3”)并单击按钮时,textView 不会显示下一个文本,直到我再次按下它。不仅如此,如果我在第一次按下按钮时再次运行该项目,它将显示我上次运行程序时的文本(直到我再次单击它)。

我可以解决这个“延迟”问题吗?或者它是 iOS 的一个错误(我认为这只是因为它保留了以前程序执行的信息)。

修正编辑:菜鸟错误。我把将字符串存储在用户数据中的语句放在带有 segue 的按钮方法中。

【问题讨论】:

  • 您正在将数据保存到持久存储 (NSUserDefaults) 并且想知道为什么它会在下次执行程序时显示该数据?
  • 那好吧。对不起,我有点菜鸟
  • 而你的“延迟”的原因仅仅是你设置数据的代码是在加载它的代码之后调用的(尝试设置断点)。
  • 除非您重置模拟器/设备,否则您保存在适当的应用程序目录或NSUserDefaults 中的任何内容都将在应用程序的运行和重建中持续存在。你能从项目中发布相关的 ViewController 代码吗?
  • 这是来自视图控制器的代码,它从用户数据中加载字符串: NSString *textString; - (void)viewDidLoad { [super viewDidLoad]; textString = [[NSUserDefaults standardUserDefaults] stringForKey:@"textString"]; _textView.text = textString; // 加载视图后做任何额外的设置。 } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // 处理所有可以重新创建的资源。 }

标签: ios objective-c viewcontroller settext


【解决方案1】:

如果这就是您对文本所做的全部,我会说这是一个缓慢的解决方案。在我看来,直接在下一个控制器上设置属性会更好。 但是,存储到 NSUserDefaults 后,调用

[[NSUserDefaults standardUserDefaults] synchronize];

否则,它会在需要时写入持久存储。

【讨论】:

  • 调用synchronize 对延迟有何帮助(提示:没有)?
  • 是的,我正在这样做,但没有任何影响
  • 好吧,我以为下一个 vc 必须等待自动定期同步,这可能会导致延迟。
  • @JulianMinde 这些值立即在NSUserDefaults 中。您可以立即读取一个值,没有延迟。持久性仅影响应用程序下次运行时可用的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多