繁体   English   中英

如何通过在自定义视图中按按钮从超级视图中删除自定义视图?

[英]How to remove custom view from superview by pushing button in custom view?

每当我的iOS应用程序中点击视图控制器的表视图的单元格时,我都想显示自己的自定义视图。 而且,当用户点击自定义视图内的按钮时,我还必须关闭自定义视图。

但是,虽然我能够在用户点击单元格时显示自定义视图,但是我无法通过点击自定义视图内的按钮来关闭自定义视图-它因以下错误而崩溃: unrecognized selector sent to instance...

因此,我想知道将按钮放置在自定义视图中并将@IBAction连接到它以关闭它的正确方法是什么。 这是我所做的:

  1. 添加@IBAction自定义视图的之间的连接.xib及其.swift文件,并调用self.removeFromSuperview()从方法中-这使得上述错误信息的应用程序崩溃。

  2. @IBAction连接添加到我的视图控制器中,以显示自定义视图(即具有UITableView视图)-无法完成此操作,因为当我尝试创建连接时,Xcode不会对控件拖动行为做出反应。

另外,如果我对它的理解正确,则无法将自定义视图的xib添加到情节提要文件中,因为自定义视图最初并未创建。 通过在运行时点击单元来实例化它。

那么,如何通过点击按钮关闭自定义视图? 我应该在哪里编写代码(即在自定义视图的.swift文件或原始VC的.swift文件中)?

更新

当我加入@IBOutlet从按钮上的自定义视图的XIB到自定义视图的连接.swift文件,并试图println()从视图控制器内,如( println(customView.dismissButton)那么它也应声由于错误提示: this class is not key value coding-compliant for the key dismissButton. 因此,最好只添加手势控制器,并使窗口上的所有轻击做出反应以消除自定义视图,这可能会更好。

更新2

我在注释部分中的@Caroline的zip文件正是我想要做的,但是我不想在代码中全部创建和实例化自定义视图,而是想在xib上创建UI,而是在xib的组件之间创建@IBAction连接和我的代码,最后从代码内部取消存档以供使用。

今天,几乎可以肯定,您应该为此使用容器视图

然后,将其隐藏,设置动画,围绕其滑动,向其发送消息(无论如何)都是微不足道的。

https://stackoverflow.com/a/23403979/294884

“谢谢。但是我是否必须使用另一个视图控制器才能做到这一点?”

当然是。 您绝对应该使用容器视图 这是多年以来的唯一方法。 只需在Storyboard中拖动一个即可。

现在几乎所有内容都是iOS中的容器视图。 每一件小事。 这是当今的“范例”。

您可以将自定义视图放入视图控制器中,并使用segues加载自定义视图。

这意味着您可以在情节提要中(在其新的视图控制器下)拥有自定义视图,并具有从表视图单元到新视图控制器的顺序,以及从新视图控制器到原始视图控制器的展开顺序。

这是一个Objective-C教程,但可能对Storyboard概念有所帮助:

http://www.raywenderlich.com/50308/storyboards-tutorial-in-ios-7-part-1

编辑:

根据视图的实际操作,为UITableViewCell详细信息调出视图的通常方法是将详细信息视图放在单独的视图控制器中,并通过segue进行链接。

我真的不知道为什么您的应用程序会因为代码而崩溃-这实际上取决于Storyboard的设置方式。 如果要在代码中执行此操作,则可以执行以下操作:

class ViewController: UIViewController {

  var greenView = UIView(frame: CGRect(x:100,y:500,width:200,height:200))
  var greenButton = UIButton(frame: CGRectMake(20, 20, 80, 40))

  override func viewDidLoad() {
    super.viewDidLoad()
    greenView.backgroundColor = UIColor.greenColor()
    greenView.addSubview(greenButton)
    greenButton.setTitle("Close Me", forState: .Normal)
    greenButton.addTarget(self, action: "hideGreenView", forControlEvents: .TouchUpInside)
  }

  func hideGreenView() {
    self.greenView.removeFromSuperview()
  }

  @IBAction func greenview(sender: AnyObject) {
    self.view.addSubview(greenView)
  }

}

该代码假定您在情节提要板上有一个链接到greenview()的按钮,但其余部分不在情节提要上。

您还可以在情节提要板上创建视图,并将其作为隐藏视图,然后在功能中隐藏或取消隐藏。 如果要对视图进行动画处理,可以使用UIView动画。

如果您的UIViewController是UITableViewController,那么您也可能会遇到问题。 您可能在UIViewController内有一个UITableView,其中UIViewController是委托和数据源,但这对我来说似乎是“臭”代码(当然,这取决于您实际上要实现的目标)。

使用XCode 8和Swift 3测试了此代码

要将自定义视图添加到SuperView,请使用:

self.view.addSubview(myView)

要从Superview中删除自定义视图,请使用:

self.view.willRemoveSubview(myView)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM