我有一个包含许多视图的UIViewController
,其中一个是一个按钮(其标签显示默认选项(,按下该按钮时,会打开一个新UIViewController
,其中包含由多个选项组成的UICollectionView
。当选择UICollectionView
中的一个项目时,我们返回到原始UIViewController
,UICollectionView
中的项目将成为在原始UIViewController
中按下的按钮的标签。
问题是我不确定如何设置它。我更熟悉Android平台,所需的功能更容易设置。我需要做的就是创建一个全屏对话框,当按下一个项目时,关闭对话框并更改按钮标题。但是,在iOS中,AlertController
类似乎功能有限(我尝试添加UICollectionView
作为子视图,但效果不佳(。因此,我继续阅读有关Android和iOS设计指南之间的差异,并根据我所阅读的内容,我应该使用模态UIViewController
。但是,如果未选择某个选项,我希望能够返回到原始UIViewController
,因此我设置了一个堆栈中两个 VC 的UINavigationController
。当我在情节提要中选择模态 segue 选项时,第二个 VC 不显示后退按钮,但当我选择正常显示选项时,会显示后退按钮。按下项目时,将创建对第一个 VC 的引用,更改按钮标签,并从堆栈中弹出第二个 VC(理想情况下(。
我想知道在iOS环境中设置所需功能的正确(最佳(方法。另外,我想知道您根据什么标准对方法进行评分?
你描述的是如何让视图控制器相互通信。 有几种方法可以做到这一点。
在一个视图控制器中,保持变量指向另一个视图控制器。 在这种情况下,请在目标中创建一个指向调用方的变量。 当您关闭目的地时,在做出选择后, 使用该变量更新调用方。
使用通知。这是任何对象调用另一个对象的间接方式。 您必须提前设置这些,但它非常有用,尤其是在 有问题的类不会自然交互。
这是如何做 1.
将 segue 从调用视图控制器添加到目标视图控制器。 在情节提要中,为续集命名,以便以后可以识别它。
在调用视图控制器上,确保按钮有插座。 使用情节提要编辑器添加插座。
按下按钮时,让它触发 segue。
在调用视图控制器中,确保存在func prepare(for segue: UIStoryboardSegue, sender: Any?)
。 在此函数中,添加代码以检测使用您在情节提要上设置的名称触发了哪个 segue。 如果你只有一个 segue,你可以省略它。
在函数中添加以下内容:
if segue.identifier == "your-segue-identifier-string" {
if let dest = segue.destination as? OptionsViewController {
dest.bookmarkViewController = self
}
}
在选项视图控制器中,添加一个变量以书签调用视图控制器。 使其成为可选(使用?
var bookmarkViewController: MyParentViewController?
在 MyParentViewController 中,添加一个更新按钮标题的函数。
func updateButton(title: String) {
// Update button title here using the outlet.
}
在选项视图控制器中,选择选项后,使用 bookmarkViewController var 调用调用方中的按钮更新函数。
self.bookmarkViewController.updateButton(title: new-title-goes-here)
// dismiss the options view controller.