Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.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
Ios 在StackView中替换UIView不会替换该视图,而只是更改指向它的指针?_Ios_Swift_Uikit_Uistackview - Fatal编程技术网

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编辑)

我想到的最好办法是:

  • 从superview(堆栈视图)中删除视图
  • 使用新的复杂属性创建新视图
  • 将此新视图添加到正确的位置,作为stackview(或我们正在使用的任何容器)的排列子视图
  • 没有比这更麻烦的方法了吗

    代码:

    // 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和许多不同的东西。问题出现了,因为我们想知道为什么需要这么多行代码才能重新创建一个单元格,因为我们必须删除所有元素,重新创建它们,配置它们并再次添加它们。