Ios 在StackView中替换UIView不会替换该视图,而只是更改指向它的指针?
我正在使用Ios 在StackView中替换UIView不会替换该视图,而只是更改指向它的指针?,ios,swift,uikit,uistackview,Ios,Swift,Uikit,Uistackview,我正在使用UIStackViews工作,遇到了一个自己无法理解的有趣问题 我认为这只是我在内存管理和地址方面的一个误解,但如果不是这样,我希望得到确认和解释 我在这里创建了一个项目来展示这个问题: 我创建了一个UILabel,将其添加到UIStackView中,我可以使用指向标签的变量编辑其值,该视图反映了我的更改 现在,如果我创建一个新的UILabel,并将其分配给原始指针。。出于某种奇怪的原因,我的大脑希望它也替换视图中的标签 相反。。变量刚开始指向新视图,另一个变量保持在UIStackV
UIStackViews
工作,遇到了一个自己无法理解的有趣问题
我认为这只是我在内存管理和地址方面的一个误解,但如果不是这样,我希望得到确认和解释
我在这里创建了一个项目来展示这个问题:
我创建了一个UILabel
,将其添加到UIStackView
中,我可以使用指向标签的变量编辑其值,该视图反映了我的更改
现在,如果我创建一个新的UILabel
,并将其分配给原始指针。。出于某种奇怪的原因,我的大脑希望它也替换视图中的标签
相反。。变量刚开始指向新视图,另一个变量保持在UIStackView
不变
视图UIStackView
对其层次结构中的视图有很强的引用?)
在UIStackView
中替换复杂视图的最佳方法是什么?
(让我们想象一个非常复杂的视图,其中包含大量数据,这些数据不能作为label.text编辑)
我想到的最好办法是:
// Let's Create a Label, and add it to a StackView
theLabel = UILabel()
theLabel.textAlignment = .Center
theLabel.text = "FIRST LABEL"
mainStackView.addArrangedSubview(theLabel)
print(mainStackView.subviews)
// Here the address of the label, in the StackView
// [<UILabel: 0x7fdc32d16150; frame = (0 0; 0 0); text = 'FIRST LABEL'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fdc32e56020>>]
// Let's change the text of the label
theLabel.text = "CHANGED FIRST LABEL"
// The UI is of course correctly edited!
print(mainStackView.subviews)
// Address is of course the same, text is of course changed.
// [<UILabel: 0x7fdc32d16150; frame = (0 0; 0 0); text = 'CHANGED FIRST LABEL'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fdc32e56020>>]
// HERE HERE!!!
// Let's replace the UILabel with a new one!
// Does this only change the variable as a pointer ???
// Let's see the address of the original label
print(unsafeAddressOf(theLabel))
// 0x00007fdc32d16150
// Let's make a second pointer to the same label
let theLabelPointerCopy = theLabel
// Let's create a new label
theLabel = UILabel()
theLabel.text = "Second Label"
print(unsafeAddressOf(theLabel))
// 0x00007fdc32e5b560
print(unsafeAddressOf(theLabelPointerCopy))
// 0x00007fdc32d16150
// Address has changed, but not for the copy and not in the stackview (makes sense, partially to me)
print(mainStackView.subviews)
// Same as before
// [<UILabel: 0x7fdc32d16150; frame = (0 0; 0 0); text = 'CHANGED FIRST LABEL'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fdc32e56020>>]
theLabelPointerCopy.text = "I Can still change what it is in the stackview"
//让我们创建一个标签,并将其添加到StackView中
标签=UILabel()
label.textAlignment=.Center
theLabel.text=“第一个标签”
mainStackView.addArrangedSubview(标签)
打印(主视图。子视图)
//这里是StackView中标签的地址
// []
//让我们更改标签的文本
theLabel.text=“更改了第一个标签”
//用户界面当然是正确编辑的!
打印(主视图。子视图)
//地址当然是一样的,文字当然是变了。
// []
//这里这里!!!
//让我们用新标签替换UILabel!
//这是否只是将变量更改为指针???
//让我们看看原始标签的地址
打印(标签的未安全地址)
//0x00007fdc32d16150
//让我们创建指向同一标签的第二个指针
让标签指针镜=标签
//让我们创建一个新标签
标签=UILabel()
theLabel.text=“第二个标签”
打印(标签的未安全地址)
//0x00007fdc32e5b560
打印(未指定的地址(标签点复印件))
//0x00007fdc32d16150
//地址已更改,但不适用于副本,也不在stackview中(部分对我来说有意义)
打印(主视图。子视图)
//和以前一样
// []
theLabelPointerCopy.text=“我仍然可以更改stackview中的内容”
@matt:如问题本身所述,让我们想象一个非常复杂的视图,其中包含大量数据,不能仅作为标签进行编辑。text@matt我们正在与同事讨论重置内部具有非常复杂ui的可排队单元格的最佳方法,而无需删除所有视图、重新创建视图并再次读取它们,这似乎很慢。然而,我们也认为手动编辑UI的所有值等需要付出相当大的努力。。因此,创建新元素似乎是更快的routeno,它是一个完全相同的单元,内部有一个巨大的UI和许多不同的东西。问题出现了,因为我们想知道为什么需要这么多行代码才能重新创建一个单元格,因为我们必须删除所有元素,重新创建它们,配置它们并再次添加它们。