在UIstackview swift中删除视图

Aha*_*lya 10 user-interface ios uistackview

我是新手.我已经为stackview添加了视图addArrangedSubview().但是我无法使用删除此视图removeArrangedSubview().即使在删除已安排的子视图后,视图仍然存在

import Foundation
import UIKit

class render: UIViewController {

  let subview    = UIStackView()
  let mainview   = UIStackView()

  override func viewDidLoad() {
    super.viewDidLoad()

    self.mainviewlet()
    self.login()
  }

  func login() {

    let username = UITextField()
    // text field

    let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
    //button

    // Adding to subview  
    subview.axis  = UILayoutConstraintAxis.vertical
    subview.distribution  = UIStackViewDistribution.equalSpacing
    subview.alignment = UIStackViewAlignment.center
    subview.spacing   = 16.0

    subview.addArrangedSubview(username)
    subview.addArrangedSubview(button)

    subview.translatesAutoresizingMaskIntoConstraints = false;

    // Adding subview to another stackview
    mainview.addArrangedSubview(subview)
    self.view.addSubview(mainview)

}
Run Code Online (Sandbox Code Playgroud)

在另一个功能中,我删除了已安排的子视图

func signup(sender: UIButton!) {

    // Remove subview
    mainview.removeArrangedSubview(subview)
    subview.removeFromSuperview()

    let firstname = UITextField()
    firstname.textAlignment = NSTextAlignment.center
    firstname.textColor = UIColor.black
    firstname.frame = CGRect()
    firstname.frame.size.height = 30;
    firstname.text = "firstname"

    subview.addArrangedSubview(firstname)
    mainview.addArrangedSubview(subview)
    self.view.addSubview(mainview)
}
Run Code Online (Sandbox Code Playgroud)

我的主视图创建为:

func mainviewlet {

  mainview.axis  = UILayoutConstraintAxis.vertical
  mainview.distribution  = UIStackViewDistribution.equalSpacing
  mainview.alignment = UIStackViewAlignment.center
  mainview.spacing   = 16.0
  mainview.translatesAutoresizingMaskIntoConstraints = false;

  self.view.addSubview(mainview)
}
Run Code Online (Sandbox Code Playgroud)

我希望删除username&button并将新字段添加firstname到子视图中.

我是以正确的方式做到的吗?如何删除子视图?谢谢你的帮助

Kos*_*dis 22

如果要隐藏堆栈视图中的视图,您只需将包含视图的hidden属性设置为true,堆栈视图将处理其余视图.

所以,就我从代码中理解的那样,您必须调用的内容如下:

subview.hidden = true
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 14

根据我实际测试实现 () 的经验,从 stackView 中删除子视图所需要做的就是在 stackView 的每个子视图上调用removeFromSuperview() 方法:

\n\n
stackView.subviews.forEach { (view) in\n    view.removeFromSuperview()\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是它在控制台中的样子:

\n\n
(lldb) po stackView.arrangedSubviews\n\xe2\x96\xbf 3 elements\n  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>\n  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>\n  \xe2\x96\xbf 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>\n\n(lldb) po stackView.subviews\n\xe2\x96\xbf 3 elements\n  - 0 : <UIStackView: 0x7f840c8297d0; frame = (0 0; 375 95); layer = <CATransformLayer: 0x600003f48c80>>\n  - 1 : <UIStackView: 0x7f840c82f5e0; frame = (0 125; 375 95); layer = <CATransformLayer: 0x600003f54520>>\n  \xe2\x96\xbf 2 : <UIView: 0x7f840b3c93a0; frame = (0 250; 375 47); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x600006bdae20>; layer = <CALayer: 0x600003f4a7e0>>\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后删除所有子视图:

\n\n
(lldb) expression stackView.subviews.forEach { (view) in view.removeFromSuperview() }\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
(lldb) po stackView.subviews\n0 elements\n\n(lldb) po stackView.arrangedSubviews\n0 elements\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以对 UIStackView 进行扩展,以节省您将来的一些输入:

\n\n
extension UIStackView {\n    func removeAllSubviews() {\n        subviews.forEach { (view) in\n            view.removeFromSuperview()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Rei*_*ill 11

在Swift 4.2中

removeArrangedSubview方法从堆栈的splittedSubviews数组中删除提供的视图。该视图的位置和大小将不再由堆栈视图管理。但是,此方法不会从堆栈的subviews数组中删除提供的视图。因此,视图仍显示为视图层次结构的一部分。

为防止在调用堆栈的removeArrangedSubview:方法后视图出现在屏幕上,请通过调用视图的removeFromSuperview()方法将其从子视图数组中显式删除,或将视图的isHidden属性设置为true。

所以:

myStackView.removeArrangedSubview(myView)
myView.removeFromSuperview()
Run Code Online (Sandbox Code Playgroud)