在Swift中将UITableView委托和dataSource分配给super

时间:2015-11-22 14:38:41

标签: ios 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()不能像宣传的那样工作?

我澄清我不能简单地在super上调用委托方法,因为它应该保留底层类的所有权,顶级类的虚方法应该找到底层类中的方法而不是超级类中的方法。需要。

这是我的代码结构,希望它能让事情更清晰: 底级

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()的实现都在底层类及其超类中定义,都继承自此类。

4 个答案:

答案 0 :(得分:0)

仅仅因为在分配代理时,您正在分配实例。 因此,如果调用委托方法,它将调用对象的方法,该方法是&#34; self&#34;类。

当您将其分配给超级时,它会继续引用您的实例,如果您使用了&#34; self&#34;那么这并不重要。或&#34; super&#34;(这是确认)。

你应该做什么,在你的类委托方法实现中调用超级实现。

答案 1 :(得分:0)

你必须把:

myTableView.delegate = self
myTableView.dataSource = self

当您将其分配给超级时,它会不断引用您的对象,如果您使用了&#34; self&#34;那么这并不重要。或&#34;超级&#34;。

答案 2 :(得分:0)

此案例的解决方案是:

  • Superclass实现了tableview的委托和数据源方法。
  • 一个单独的类(称为例如TableDelegate),它实现了tableview的委托和数据源方法。

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

当需要调用超类委托,数据源时,分配self,Swift将从超类中找到实现,否则分配给仅用作tableview的委托和数据源的类。

答案 3 :(得分:0)

我也通过在所有委托方法上调用super来结束。当然,将表或其委托和dataSource切换到顶级类会更简洁,但这在Swift中不起作用。

然而,即使这推动了虚函数调用底层实现。调用顶级委托方法显然不会更改虚函数在实现其方法时找到的活动实例。当然,即使是实现,我也需要向上发送,但这肯定是支持的错误。