当通过 segue 传递数据时,我注意到一些奇怪的事情,我只是想不通为什么会这样。我知道我很可能误解了类的性质,所以如果我能得到一些帮助来了解它,我将不胜感激。
当我通过 segue(都连接到导航 Controller )将 Int 或 String 传递给第二个 View 时,然后在第二个 View 中更改该值,然后返回到第一个 View ,该 Int 或字符串将与最初在第一个 View 中设置的相同,不保留在第二个 View 中更改的值。这是有道理的,也是我无论如何都希望发生的事情。
但我注意到在使用自定义类时情况并非如此。如果我更改了属于该类的值,它们将在返回第一个 View 时保留。我确实注意到,如果我试图用一个全新的类替换整个类,那是行不通的,这类似于尝试更改整个 Int,但为什么在这种情况下仅更改类的属性仍然有效?
我确实知道如何将数据传递回以前的 View ,这更多是为了让我更好地理解为什么事情会这样。
我一直在玩弄它,这里是更好地解释我在说什么的代码:
第一个 View Controller :
class ViewController: UIViewController {
var number = 5
var string = "Hello from View 1"
var object = Object(number: 5, string: "Hello from View 1", bool: false)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("PAGE 1 NUMBER: ", number)
print("PAGE 1 STRING: ", string)
print("PAGE 1 OBJECT NUMBER: ", object.number)
print("PAGE 1 OBJECT STRING: ", object.string)
print("PAGE 1 OBJECT BOOL: ", object.bool)
}
@IBAction func buttonPress(_ sender: Any) {
self.performSegue(withIdentifier: "toSecond", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toSecond" {
let vc = segue.destination as! SecondViewController
vc.number = number
vc.string = string
vc.object = object
}
}
}
第二个 View Controller :
class SecondViewController: UIViewController {
var number = 0
var string = ""
var object = Object()
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("PAGE 2 NUMBER: ", number)
print("PAGE 2 STRING: ", string)
print("PAGE 2 OBJECT NUMBER: ", object.number)
print("PAGE 2 OBJECT STRING: ", object.string)
print("PAGE 2 OBJECT BOOL: ", object.bool)
number = 12
string = "Hello back from View 2"
object.number = 12
object.string = "Hello back from View 2"
object.bool = true
object = object2
}
}
控制台输出:
PAGE 1 NUMBER: 5
PAGE 1 STRING: Hello from View 1
PAGE 1 OBJECT NUMBER: 5
PAGE 1 OBJECT STRING: Hello from View 1
PAGE 1 OBJECT BOOL: false
PAGE 2 NUMBER: 5
PAGE 2 STRING: Hello from View 1
PAGE 2 OBJECT NUMBER: 5
PAGE 2 OBJECT STRING: Hello from View 1
PAGE 2 OBJECT BOOL: false
PAGE 1 NUMBER: 5
PAGE 1 STRING: Hello from View 1
PAGE 1 OBJECT NUMBER: 12
PAGE 1 OBJECT STRING: Hello back from View 2
PAGE 1 OBJECT BOOL: true
我已经搜索了几天来寻找这个问题的答案(如果之前有人回答过,我将不胜感激)。
最佳答案
由于还没有人回答你的问题,我将在这里添加我的答案。
But I noticed when working with a custom class this was not the case. If I changed values that belonged to that class, they would retain when going back to the first view. I did notice that if I tried to replace the whole class with a completely new one, that would not take, which would be similar to trying to change a whole Int, but why would only changing the class' properties still work in that case?
出现此行为的原因是因为如评论中所述,类是引用类型,因此您为其属性设置的任何值在您使用它的相同实例的所有地方都可用。 IMO,这是类在 swift 中相对于结构的一大优势。如果您不想要这种行为,您可以考虑将 Object 更改为结构类型。
在您的情况下,即使您在 SecondViewController 中初始化 var object = Object(),您也在用您的 object 替换该实例ViewController 中的实例作为 vc.object = object 在 prepareForSegue 方法中。由于您正在执行此操作,因此当您返回上一屏幕时,您对对象属性所做的任何更改都将保留。
关于ios - Swift - 为什么传递的自定义类在返回到上一个 View 时保留更改的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686186/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput