0

学习一些视图控制器基础知识,并坚持如何使用按钮关闭模式。

在我精简的示例中,我有两个视图设置,初始视图和模态视图。第一个视图有一个成功弹出模态的按钮。在模式上,有一个应该自行关闭的按钮。

根据其他 帖子和文档,我应该能够像这样运行附加到按钮的简单代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func CloseModal(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

}

当我点击“关闭模式”按钮时,没有任何反应。我在这里想念什么?我把这段代码放在错误的地方吗?目前,它位于主 ViewController.swift 文件中。

在此处输入图像描述

4

2 回答 2

3

另一种方法是对主视图控制器使用展开转场。只需在第一个视图控制器中添加一个“展开动作”:

class ViewController: UIViewController {

    @IBAction func unwindHome(_ segue: UIStoryboardSegue) {
        // this is intentionally blank
    }

}

在这个例子中,只要给这个展开动作一个有意义的名字,unwindHome这样,如果你以后有多个展开动作时,你可以很容易地区分它们。

然后您可以control从第二个场景中的按钮 - 拖动到“退出”控件并选择适当的展开操作:

连接出口

这有几个不错的方面:

  • “关闭”按钮不再关心你如何呈现它,它会展开,但它是适当的(例如,如果你稍后将初始转场更改为显示/推送转场,展开转场仍然可以在没有任何代码更改的情况下工作)。

  • 因为您现在使用 segue 来展开,所以prepare(for:sender:)如果您最终需要这样做,呈现的视图控制器可以使用它来发送数据。

  • 如果需要,您可以展开多个场景。例如,如果 A 呈现 B,B 呈现 C,你显然可以从 C 展开到 B,但如果你愿意,你也可以从 C 一直展开到 A。

因此,虽然dismiss有效,但 unwind segues 是另一种选择。

于 2020-05-18T16:03:16.927 回答
1

你实际上有两个 ViewController 屏幕,但看起来你有一个 ViewController 类?第二个屏幕是否连接到一个班级?

必须在属于 closeModal 方法的第二个屏幕的类中。

//This is First ViewController, OpenModal Button is here
class ViewController: UIViewController {

  override func viewDidLoad() {
     super.viewDidLoad()
  }

}


// The name of the class and the Viewcontroller in the storyboard have to be the same, and CloseModol Button and function need to be here 
class SecondViewController: UIViewController {

  override func viewDidLoad() {
     super.viewDidLoad()
  }

  @IBAction func CloseModal(_ sender: Any) {
     self.dismiss(animated: true, completion: nil)
  } 

}

不要忘记在 Storyboad 中设置 ViewController 的名称;从 FirstViewController 到 SecondViewController

于 2020-05-18T14:53:07.240 回答