我有一个ViewController,这个视图容器有一个类,它创建2个容器视图,并添加一个表到第一个容器和第二个HashtagPicker。从父ViewController调用函数
hashTagPicker具有一个函数,只要发生对所选hashTags的更改,就会调用该函数。
问题:我要打电话时标签被改变了更新表功能。我如何从包含容器的类中定义的hashtagclass调用函数?
我有一个ViewController,这个视图容器有一个类,它创建2个容器视图,并添加一个表到第一个容器和第二个HashtagPicker。从父ViewController调用函数
hashTagPicker具有一个函数,只要发生对所选hashTags的更改,就会调用该函数。
问题:我要打电话时标签被改变了更新表功能。我如何从包含容器的类中定义的hashtagclass调用函数?
您可以使用委托/本
首先协议在HashtagPicker
类中创建Protocol
protocol HashTagPickerDelegate {
func hastagPicked(hashtag:String)
}
现在为这个协议HashtagPicker类创建一个对象现在
class HashtagPicker : UIViewController
{
var delegate: HashTagPickerDelegate?
}
调用当用户从表视图中选择标签时使用此委托对象的协议方法(从didSelectRow
我的ThOD)
delegate.hashtagPicked(pickedHashtag)
不要忘记在父视图注册协议,
class ParentView:UIViewController, HashTagPickerDelegate
{
}
,并设置parentView作为HastagPicker委托对象,因为你正在使用的容器,你可以从prepareForSegue
做方法。不要忘记为容器segue设置segue id。
func prepare(for segue: UIStoryboardSegue, sender: AnyObject?)
{
if segue.identifier == "HastagPickerSegue" // use your segue id here
{
let hashtagPicker = segue.destinationViewController as! HashtagPickerView
hashtagPicker.delegate = self
}
}
谢谢你,正是我所期待的。我没有使用segue,因为我已经初始化控制器并同时显示它们,所以这不是必需的(对于读这个的人) –
您可以使用委托如上答复中提到。或者你可以使用通知。所以这里是使用通知的解决方案。
首先注册一个通知你父母的viewController的viewDidLoad
这样
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ParentViewController.someActionToBePerformed), name: "myNotification", object: nil)
创建你的父母的viewController函数命名同上所以它会像
func someActionToBePerformed() {
// this will be called when hashTag is changed
// do something when hashTag is changed
}
现在你可以只需从您的标签viewController
发布通知即可。当你想要这样。
NSNotificationCenter.defaultCenter().postNotificationName("myNotification", object: nil)
意味着你必须包含VC B和VC C,在VC B您做一些事情之后,你想VC C到更新它的表视图VC阿? – Tj3n
通常的方法是将父引用(协议/委托模式)或回调关闭传递给子控制器。 – vadian
@ Tj3n是的,确切地说。 vc B说新的hashTags已设置,现在告诉vc A告诉vc B调用updateTable例如 –