我有一个UIViewController
,其中包含许多视图,其中一个是按钮(其标签显示默认选项),当按下该按钮时,会打开一个新的UIViewController
,其中包含由多个选项组成的UICollectionView
。当选择UICollectionView
中的一项时,我们将返回到原始UIViewController
,而UICollectionView
中的该项将成为原始{{1 }}。
问题是我不确定如何设置。我对Android平台更加熟悉,所需的功能也更容易设置。我要做的就是创建一个全屏对话框,当按下某个项目时,关闭该对话框并更改按钮标题。但是,在iOS中,UIViewController
类似乎在功能上受到限制(我尝试添加AlertController
作为子视图,但效果不太好)。因此,我继续阅读有关Android和iOS设计指南的区别,并根据阅读的内容,我应该使用模式UICollectionView
。但是,如果未选择选项,那么我希望能够返回到原始的UIViewController
,因此我在堆栈中同时设置了两个VC的UIViewController
。当我在情节提要中选择模式选择选项时,第二个VC不会显示后退按钮,但是当我选择常规的显示选项时,会显示后退按钮。当按下一个项目时,将创建对第一个VC的引用,更改按钮标签,并从堆栈中弹出第二个VC(理想情况下)。
我想知道在iOS环境中设置所需功能的正确(最佳)方法。另外,我想知道您对方法进行评分的标准是什么?
答案 0 :(得分:0)
您要描述的是如何使ViewController彼此交谈。 有几种方法可以做到这一点。
在一个视图控制器中,保持指向另一个视图控制器的变量。 在您的情况下,请在目标中创建一个指向调用者的变量。 撤消目的地后,做出选择后, 使用变量来更新调用方。
使用通知。这是任何对象调用另一个对象的间接方式。 您必须事先进行设置,但这非常有用,尤其是当 有问题的课程不会自然互动。
这里是怎么做1。
从调用视图控制器向目标视图控制器添加序列。 在StoryBoard中,为seque命名,以便以后识别。
在调用视图控制器上,确保您有按钮的插座。 使用StoryBoard编辑器添加插座。
按下按钮时,它会触发搜索。
在呼叫视图控制器中,确保有一个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
}
}
在OptionsViewController中,添加一个var来标记调用视图控制器。 将其设为可选(使用?)。
var bookmarkViewController: MyParentViewController?
在MyParentViewController中,添加一个更新按钮标题的函数。
func updateButton(title: String) {
// Update button title here using the outlet.
}
在OptionsViewController中,选择一个选项后,使用bookmarkViewController var调用调用者中的按钮更新功能。
self.bookmarkViewController.updateButton(title: new-title-goes-here)
// dismiss the options view controller.