2015-11-22 60 views
0

我正在嘗試使用超類填充並處理某個段的表的內容。所以我想到實施:在Swift中將UITableView委託和數據源分配給super

@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()不能像廣告一樣工作?

我澄清我不能簡單地調用超級代理方法,因爲它應該保留底層類的所有權,並且頂級類的虛擬方法應該在底層類中找到方法,而不是超類的方法,因爲它將需要。

那我的代碼的結構,希望它使事情更清楚: 中底層

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:%@ %@",[email protected]"favorites": @"near", [email protected]"normal":@"searched"); 
    print("sono \(self)") 
    if (normal) { 
     return sourceArray() 
    } else { 
     return arrayOfContentsFromSearchArray(searchResults, favorites:favorites) 
    } 
} 

sourceArray的實現( )和arrayOfContentsFromSearchArray()都在底層類和它的超類中定義,它們都從這個類繼承。

+0

你需要那個「sourceForTableKind」應該執行父母的執行? –

回答

0

我也結束了,也建議,通過調用所有委託方法的超級。當然,將表或它的委託和數據源切換到頂級類會更清潔,但這在Swift中不起作用。

然而,即使這會推動虛函數來調用底層實現。調用頂層委託方法並不會改變虛函數在實現其方法時發現的活動實例。當然,即使是實現,我也需要笨拙地向上發送,但這絕對是支持的一個錯誤。

0

只是因爲當你分配委託時,你正在分配實例。 所以如果委託方法被調用,它會調用對象的方法,這是「自我」類的一個實例。

當你將它分配給super時,它會一直引用你的實例,如果你使用「self」或「super」(這是爲了確認),這並不重要。

你應該怎麼做,在你的類的實現委託方法調用超級的實現。

+0

當然,但這樣做時,執行該行爲的實體應保持最低等級。我的項目基於虛擬繼承,所以如果我簡單地從底層類「numberOfRowsInSection」中調用委託並且該類在頂級類中調用虛函數,那麼要實例化的具體函數是底層類中的一個的超級類之一。 –

+0

「numberOfRowsInSection」沒有在超類中實現? –

+0

你可以決定是否要給孩子打電話超級方法 –

0

你必須把:

myTableView.delegate = self 
myTableView.dataSource = self 

當你把它分配給超級它不斷引用到你的對象,如果你使用的「自我」和「超」沒關係。

+0

關鍵是我需要引用super,否則在頂級類中定義的虛函數會在底級而不是超級類上調用。 –

0

用於這種情況下的解決辦法是:

  • 父類實現的tableview的委託和數據源的方法。
  • 一個單獨的類(稱爲例如TableDelegate),它實現tableview的委託和數據源方法。

    if (selection.selectedSegmentIndex == 1) { 
        self.myTableView.delegate = self; 
        self.myTableView.dataSource = self; 
        } else { 
         self.myTableView.delegate = instanceOfTableDelegate; 
         self.myTableView.dataSource = instanceOfTableDelegate; 
        }` 
    

當需要超代表,數據源被調用,指定自我,斯威夫特會發現從超實施,以其他方式轉讓給其只作爲委託和數據源的實現代碼如下的類。

+0

但是這會搞砸繼承。我的目標是在頂層虛擬類中調用一個模板方法,調用底層類中實現的虛擬方法,並根據其激活。從我對你的例子的理解來看,這個TableDelegate與其他類沒有繼承關係,那麼它的方法怎麼可能被頂級的虛擬超類調用呢? –

相關問題