我有一個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例如 –