【问题标题】:IOS Data Between View Controllers视图控制器之间的 IOS 数据
【发布时间】:2015-07-14 19:58:08
【问题描述】:

我有一个带有 2 个视图控制器 A 和 B 的导航控制器。

A 和 B 都有一个属性

@property (strong, nonatomic) NSString *string;

在控制器 A 中创建字符串并传递给控制器​​ B

ViewControllerB.string = self.string;
[self.navigationController pushViewController:ViewControllerB];

在视图控制器B中,字符串被修改,当我弹出视图控制器A时,字符串的值没有改变。

既然他们都持有对它的强引用,不应该在两个视图控制器中更改字符串吗?

我错过了什么吗?

【问题讨论】:

  • 在该设置中,我认为处理它的最佳方法是委托或可能使用块。稍后我会尝试发布一些示例。
  • 听起来你的困惑是由于误解了按引用传递与按值传递之间的区别。有关详细信息,请参阅此链接:stackoverflow.com/questions/2892520/…

标签: ios viewcontroller ivar


【解决方案1】:

在视图控制器 B 中,字符串被修改

这是不可能的,因为您使用的是NSString,而不是NSMutableString。如果在ViewControllerB内替换:

self.string = @"some other string";

然后您将设置ViewControllerBstring 属性以引用该新字符串,但对原始字符串的其他引用不受影响。

如果您真的希望两个视图控制器都修改相同的字符串,请使用NSMutableString。但是共享可变状态可能很糟糕。相反,请考虑使用中间类(如数据源),或 ViewControllerB 的委托模式将更新后的字符串交给 ViewControllerA

【讨论】:

  • 我的印象是这里的问题不是字符串的修改,我猜这是通过将它设置为等于另一个字符串来完成的,而是通过引用与 by-价值问题...
  • 问题是 VCA 引用了旧字符串,而 VCB 引用了新字符串。 OP 希望 VCB 的新字符串传播回 VCA,但由于 VCB 正在创建一个新字符串而不是修改现有字符串,因此这不会发生。
  • 就像我说的那样,这是因为字符串是按值传递的,而他似乎希望它表现得像按引用传递一样。为什么将其更改为 NSMutableString 的实例可以解决问题?
  • @Mike 使用NSMutableString,OP 可以用新数据修改相同的字符串对象。 VCA 和 VCB 都会引用相同的可变字符串。
  • 如果它们共享相同的引用,则其可变与否这一事实影响较小,具体取决于 OP 所指的“修改”。如果他的意思是string = @"anotherString",让它可变没有区别。我对解决方案并没有真正的分歧,但你的答案的重点似乎是字符串的可变性,我个人认为 by-ref/by-val 是他可能最困惑的地方,基于问题。如果他试图以与可变字符串相同的方式修改普通字符串,那么他无论如何都会收到一组不同的警告/错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2015-12-28
  • 2014-02-20
  • 1970-01-01
相关资源
最近更新 更多