2016-11-21 110 views
0

我有一个ViewController,这个视图容器有一个类,它创建2个容器视图,并添加一个表到第一个容器和第二个HashtagPicker。从父ViewController调用函数

hashTagPicker具有一个函数,只要发生对所选hashTags的更改,就会调用该函数。

问题:我要打电话时标签被改变了更新表功能。我如何从包含容器的类中定义的hashtagclass调用函数?

+1

意味着你必须包含VC B和VC C,在VC B您做一些事情之后,你想VC C到更新它的表视图VC阿? – Tj3n

+1

通常的方法是将父引用(协议/委托模式)或回调关闭传递给子控制器。 – vadian

+0

@ Tj3n是的,确切地说。 vc B说新的hashTags已设置,现在告诉vc A告诉vc B调用updateTable例如 –

回答

4

您可以使用委托/本

首先协议在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 
    } 
} 
+0

谢谢你,正是我所期待的。我没有使用segue,因为我已经初始化控制器并同时显示它们,所以这不是必需的(对于读这个的人) –

4

您可以使用委托如上答复中提到。或者你可以使用通知。所以这里是使用通知的解决方案。

首先注册一个通知你父母的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)