覆盖方法会产生冲突或找不到其父等效项

时间:2016-03-09 17:47:31

标签: swift

当我尝试以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,但它不会调用我的版本,这正是我正在寻找的。

1 个答案:

答案 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不一样。

相关问题