【问题标题】:how to dismiss a subview by a button inside the same subview which is a UIViewController如何通过 UIViewController 同一子视图内的按钮关闭子视图
【发布时间】:2015-12-08 13:25:52
【问题描述】:

我有 2 个 UIViewController。第一个 ViewController 有一个标签、视图和一个按钮,第二个视图有一个标签、文本框和添加按钮,在底部的 ok 按钮。两个 ViewController 都有单独的 swift 文件。当我按下第一个 ViewController 中的按钮时,它会将第二个视图控制器显示为子视图。在子视图中一切正常

但是当我按下确定按钮时,我希望取消子视图。我在谷歌上搜索但找不到任何相关答案。

注意:我使用的是 Xcode 7.1.1 swift2。取消按钮必须放在子视图中。

用于将第二个视图显示为子视图的代码

    let object = self.storyboard?.instantiateViewControllerWithIdentifier("caller") as? ViewController
    self.view.addSubview(object!.view)

这里调用者 - 2nd viewController StoryBoard ID 。 ViewController - 第二个 ViewController

【问题讨论】:

  • 你能展示一些你如何呈现第二个视图控制器的代码吗?
  • @AndréSlotta 查看已编辑

标签: ios swift uiview swift2


【解决方案1】:

我认为,与其将第二个视图控制器的视图添加为您的第一个视图控制器的子视图,您真正应该(甚至可能想要)做的是:

在您的第一个视图控制器中呈现第二个视图控制器:

let vc2 = self.storyboard?.instantiateViewControllerWithIdentifier("caller")
presentViewController(vc2!, animated: true, completion: nil)

在您的第二个视图控制器中关闭第一个视图控制器:

dismissViewControllerAnimated(true, completion: nil)

【讨论】:

  • 这真的很好用。但是第二个视图隐藏了第一个视图。相反,我希望它像一个警报视图,旧屏幕仍然存在,但只能访问弹出窗口。
【解决方案2】:

您有 3 个选项 1.在第二个视图控制器的按钮动作方法中添加这一行self.dismissViewControllerAnimated(true, completion: nil)

缺点:通常视图控制器不是他解雇的责任人

优点:简单

  1. 如果您使用的是 Swift,您可以尝试添加一个完成处理程序: 在第二个 ViewController 添加这个 var completionHandler: (() -> Void)? = nil 在你这样称呼它的动作中self.completionHandler?()

在第一个视图初始化后你的第二个视图,你能用这个来采取行动吗

secondViewController.completionHandler = {
secondViewController.dismissViewControllerAnimated(true, completion: nil)
}

优点:我喜欢闭包

缺点:还没找到

  1. 您可以使用委托方法 优点: 代表 缺点:我更喜欢封闭

仅供参考,因为您没有告诉我们您如何展示您的观点,我的解决方案已经完成,假设您使用 presentViewController 进行展示

更新

我看到您更新了您的问题,在这种情况下,方法 nr 2. 是唯一可以更改的方法

object.completionHandler = {
    object.view.removeFromSuperview()
}

我唯一要补充的是,不要将 ViewController 添加为子视图,而是使用 UIView

【讨论】:

  • 感谢您的回答。但是您的做法实际上隐藏了整个视图控制器。相反,我希望第二个 ViewController 显示为弹出或警报视图。
  • 在这种情况下,你不需要使用 ViewController,创建一个自定义 View
【解决方案3】:

用于显示当前视图控制器

let presentVC = FirstViewController(); self.navigationController?.presentViewController(presentVC, animated: true, completion: nil)

然后在“SecondViewController”按钮上单击操作

self.dismissViewControllerAnimated(true, completion: nil)

我认为这会奏效。

【讨论】:

  • 感谢您的回答。但是此方法隐藏了整个屏幕。相反,我希望第二个 ViewController 显示为弹出或警报视图。
  • 您是否希望在按钮上(在 SecondViewController 中)单击 SecondViewController 应该作为警报视图留在第一个视图控制器的前面?
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多