2016-11-21 116 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)