2015-11-22 66 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与其他类没有继承关系,那么它的方法怎么可能被顶级的虚拟超类调用呢? –

相关问题