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

Posted

技术标签:

【中文标题】如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?【英文标题】:How to remove custom view from superview by pushing button in custom view? 【发布时间】:2014-09-20 06:36:59 【问题描述】:

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

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

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

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

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

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

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

更新

当我从自定义视图的 xib 上的按钮添加一个 @IBOutlet 连接到自定义视图的 .swift 文件,并尝试从视图控制器(例如 (println(customView.dismissButton)) 内)println() 时,它也由于错误而崩溃:this class is not key value coding-compliant for the key dismissButton.。所以我最好只添加手势控制器并让窗口上的任何点击做出反应以关闭自定义视图......这很恶心。

更新 2

@Caroline 在评论部分的 zip 文件正是我想要做的,但是我不想在代码中创建和实例化自定义视图,而是想在 xib 上创建 UI,在xib 和我的代码上的组件,最后从代码中解压缩它以使用。

【问题讨论】:

【参考方案1】:

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

然后隐藏它、动画它、滑动它、向它发送消息——不管怎样都是微不足道的。

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

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

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

everything 现在在 iOS 中几乎是一个容器视图。每一件小事。这是当时的“典范”。

【讨论】:

Then it is trivial to hide it, animate it, slide it around, send messages to it - whatever.你知道这方面的好教程吗? 嗯!好问题!我去看看 我一直在网上搜索,但是关于它的教程很少。此外,大多数 iOS 书籍甚至都没有提及它。我觉得有趣的是 O'reilly 的 Programming iOS8,它非常深入地解释了容器视图(在代码和故事板中,在第 6 章中),我现在一直在阅读。【参考方案2】:

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

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

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

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 是委托和数据源,但这对我来说似乎是“臭”的代码(当然,这取决于你实际想要实现的目标)。

【讨论】:

谢谢。但是我是否必须使用另一个视图控制器才能做到这一点? 编辑了通过按钮添加和删除视图的示例(但是,此示例不是来自 UITableViewCell,这可能是您的问题) 是的,我尝试按照您在代码中编写的内容进行操作,但 Xcode 不允许我创建 @IBAction 连接(查看我原始帖子中的第二个列表)。不过,我还没有将它用作隐藏视图。 如果要向 UITableViewCell 添加按钮,则必须将该按钮连接到与 UITableViewCell 关联的类中的 @IBAction。您不能将单元格中的按钮附加到 UITableViewController,因为内存中的按钮与单元格的数量一样多。 不,我不想向UITableViewCell 添加按钮。我想显示一个自定义视图并在其上放置一个按钮。每当用户点击原始视图控制器中的UITableViewCell 时,就会显示自定义视图,并在用户点击显示的自定义视图上的按钮时将其关闭。【参考方案3】:

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

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

self.view.addSubview(myView)

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

self.view.willRemoveSubview(myView)

【讨论】:

以上是关于如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UITableViewCell 中按下 UIButton 时如何获取 indexPathForSelectedRow

如何通过在android中按下按钮来添加纯文本视图?

如何检测在导航控制器的下一个视图控制器中按下后退按钮

如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?

Swift:在警报视图中按下按钮后,tableView 不会重新加载数据

在表格视图中按下单元格上的按钮时如何创建新单元格