当我尝试以ttTabBar
方式覆盖TTTabBar
函数时:
override func ttTabBar(tabBar: TabBar, shouldChangeTab tabBarItem: TabBarItem) -> Bool {
for var i = 0; i < tabBar.tabBarItems.count; i++ {
tabBar.tabBarItems[i].unselectItem()
}
tabBarItem.selectItem()
return true
}
我明白了:
Method不会覆盖其超类
中的任何方法
据我所知,这是错误的:
public class TTTabBar: UIViewController {
internal func ttTabBar(tabBar: TTTabBar, shouldChangeTab tabBarItem: TTTabBarItem) -> Bool {
if tabBarItem.isButton {
self.ttTabBar(tabBar, buttonHasBeenClicked: tabBarItem)
return false
}
return true
}
internal func ttTabBar(tabBar: TTTabBar, tabWillDisappear tabBarItem: TTTabBarItem) {
}
internal func ttTabBar(tabBar: TTTabBar, tabDidDisappear tabBarItem: TTTabBarItem) {
}
internal func ttTabBar(tabBar: TTTabBar, tabWillAppear tabBarItem: TTTabBarItem) {
}
internal func ttTabBar(tabBar: TTTabBar, tabDidAppear tabBarItem: TTTabBarItem) {
}
internal func ttTabBar(tabBar: TTTabBar, buttonHasBeenClicked tabBarItem: TTTabBarItem) {
}
}
尽管如此,我删除了override
关键字,但后来我得到了这个,顺便说一下,它告诉我他知道我想要覆盖的内容:
使用Objective-C选择器的方法'ttTabBar(:shouldChangeTab :)' 'ttTabBar:shouldChangeTab:'与方法冲突 来自超类'TTTabBar'的'ttTabBar(:shouldChangeTab :)' 相同的Objective-C选择器
我发现为了避免后者,我可以添加@nonobjc
属性,但我觉得这不是一个好方法。因为我不知道这里发生了什么。另外,我刚刚发现它实际上并没有像我预期的那样表现。 TTTabBar
在内部调用ttTabBar
,但它不会调用我的版本,这正是我正在寻找的。 p>
答案 0 :(得分:1)
方法签名必须与被覆盖的方法相同。见这个例子:
class TestX {
func afunc(name: String) {
}
}
class TestY : TestX {
override func afunc(name: Bool) {
// complains about not needing override.
}
}
class TestZ : TestX {
override func afunc(name: String) {
// compiles
}
}
在您的代码中,方法签名略有不同。
类型TTTabBarItem和TabBarItem不一样。