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

时间:2014-09-20 06:37:00

标签: ios uiview swift xib

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

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

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

  1. 在自定义视图的@IBAction及其.xib文件之间添加.swift连接,并从方法中调用self.removeFromSuperview() - 这会导致应用崩溃并出现错误上面的消息。

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

  3. 另外,如果我理解正确,我无法将自定义视图的xib添加到storyboard文件中,因为最初不会创建自定义视图;它是通过在运行时点击单元格来实例化的。

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

    更新

    当我从自定义视图的xib上的按钮添加@IBOutlet连接到自定义视图的.swift文件时,并在视图控制器中尝试println(),如({{ 1}}),然后它因崩溃而崩溃:println(customView.dismissButton)。所以我可能最好只是添加手势控制器并对窗口进行任何点击以反复关闭自定义视图......这非常令人作呕。

    更新2

    @ Caroline在评论部分的zip文件正是我想要做的,但不是从代码中创建和实例化自定义视图,我想在xib上创建UI,创建this class is not key value coding-compliant for the key dismissButton.连接在xib和我的代码之间的组件之间,最后从代码中取消它以供使用。

3 个答案:

答案 0 :(得分:3)

今天,您几乎肯定会使用容器视图

然后隐藏它,为它制作动画,滑动它,向它发送消息 - 无论如何都是微不足道的。

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

  

“谢谢。但我是否必须使用另一个视图控制器来执行此操作?”

是的,当然。你绝对应该使用容器视图。这是多年来唯一的出路。 只需在Storyboard中拖一个。

非常所有现在是iOS中的容器视图。每一件小事。这是当天的“范例”。

答案 1 :(得分:1)

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

这意味着您可以在故事板中(在其新的视图控制器下)拥有自定义视图,并具有从表视图单元格到新视图控制器的segue,以及从新视图控制器到原始视图的展开segue查看控制器。

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

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

编辑:

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

我真的不知道为什么你的应用程序会崩溃你的代码 - 这实际上取决于故事板的设置方式。如果你在代码中这样做,你可以这样做:

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是委托和数据源,但这看起来像是" smelly"代码给我(取决于你实际上想要实现的目标)。

答案 2 :(得分:-1)

使用XCode 8和Swift 3

测试此代码

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

<强> self.view.addSubview(MyView的)

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

self.view.willRemoveSubview(myView)