[英]Assigning UITableView delegate and dataSource to super in Swift
我正在嘗試填充一個超類並處理某個段的表的內容。 所以我想到了實現:
@IBAction func changeValue(sender:AnyObject){
self.searchDisplayController?.setActive(false, animated:false)
if (selection.selectedSegmentIndex==1){
self.myTableView.delegate=super
self.myTableView.dataSource=super
} else {
self.myTableView.delegate=self
self.myTableView.dataSource=self
}
self.myTableView.reloadData()
}
但是我有一個錯誤。 通過測試,編譯器建議我使用:
@IBAction func changeValue(sender:AnyObject){
self.searchDisplayController?.setActive(false, animated:false)
if (selection.selectedSegmentIndex==1){
self.myTableView.delegate=super.self()
self.myTableView.dataSource=super.self()
} else {
self.myTableView.delegate=self
self.myTableView.dataSource=self
}
self.myTableView.reloadData()
}
不管構造super.self()的含義是什么
然而,盡管代碼毫無問題地通過了那里,但該命令似乎被忽略了,並且委托方法是在同一個類而不是父類上調用的,甚至打印了super.self()的值也表明它是當前類。 ,不為人所知,當我跳過()時,Xcode鼓勵我說:
函數產生預期的類型'LogsViewController'; 您是說用“()”來稱呼它嗎?
但是,當我添加雙括號時,它將返回當前類,而不是頂部的LogsViewController。 實現我所需的正確方法是什么?為什么super.self()不能像宣傳的那樣工作?
我要澄清的是,我不能簡單地在super上調用委托方法,因為它將保留對底層類的所有權,而在頂層類上的虛擬方法將在底層類中找到方法,而不是需要的超級類之一。
那就是我代碼的結構,希望它使事情變得更清楚: Bottom Class
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete method implementation.
// Return the number of rows in the section.
let isMainTable = tableView==self.myTableView
let isFavorite = selection.selectedSegmentIndex==2
var count: Int?
count = sourceForTableKind(isMainTable, favorites:isFavorite)?.count
if (count==nil) {
return 0
}
return count!
}
頂級“虛擬課”:
func sourceArray()->Array<NearElement>?{
return nil
}
func arrayOfContentsFromSearchArray(searchArray:Array<String>?, favorites:Bool)->Array<NearElement>?{
return nil
}
func sourceForTableKind(normal: Bool, favorites:Bool)->Array<NearElement>?{
// NSLog(@"source:%@ %@",favorites?@"favorites": @"near", normal?@"normal":@"searched");
print("sono \(self)")
if (normal) {
return sourceArray()
} else {
return arrayOfContentsFromSearchArray(searchResults, favorites:favorites)
}
}
sourceArray()和arrayOfContentsFromSearchArray()的實現都是在底層類及其父類中定義的,它們都繼承自該類。
僅僅是因為在分配委托時,您是在分配實例。 因此,如果調用了委托方法,它將調用該對象的方法,該方法是“ self”類的實例。
當您將其分配給super時,它會繼續引用您的實例,並且使用“ self”還是“ super”都沒有關系(這是要確認的)。
您應該做的是,在委托方法的類實現中調用超類的實現。
您必須輸入:
myTableView.delegate = self
myTableView.dataSource = self
當您將其分配給super時,它將始終引用您的對象,並且使用“ self”還是“ super”都沒有關系。
這種情況的解決方案是:
一個單獨的類(例如,稱為TableDelegate
), TableDelegate
實現tableview的委托和數據源方法。
if (selection.selectedSegmentIndex == 1) { self.myTableView.delegate = self; self.myTableView.dataSource = self; } else { self.myTableView.delegate = instanceOfTableDelegate; self.myTableView.dataSource = instanceOfTableDelegate; }`
當需要調用超類委托,數據源,分配自身時,Swift將從超類中找到實現,否則分配給僅用作表視圖的委托和數據源的類。
正如建議的那樣,我最后在所有委托方法上調用了super。 當然,將表或其委托和dataSource切換到頂級類會更干凈一些,但是在Swift中根本不起作用。
然而,即使如此,也迫使虛函數調用了底層實現。 調用頂級委托方法顯然不會改變虛擬函數在實現其方法時發現的活動實例。 當然,我甚至需要笨拙地向上發送實現,但這絕對是支持的一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.