从函数swift中的另一个类调用函数

时间:2017-08-18 21:39:01

标签: ios swift

我为按钮创建了一个类和函数:

class FloatingActionButton: UIButtonX {

override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
    UIView.animate(withDuration: 0.3, animations: {
        if self.mapTypeButton.transform == .identity { 
             self.mapTypeButton.transform = CGAffineTransform(rotationAngle: 45 * (.pi / 180)) .                       
        } else {
            self.mapTypeButton.transform = .identity
    return super.beginTracking(touch, with: event)}

现在我在另一个类ViewController中,我想调用我的函数(请参阅更新以了解我为什么要调用我的函数)

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    self.closeMapType()
    FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)
    return true
}

但我被告知beginTracking不是可以调用的函数类型。

更新:

我在故事板上设置了按钮并将其连接到指针。现在,按钮位于this(照片1),(我很抱歉,我没有足够的声望点来发布照片)。当我在模拟器中点击它时,它会变为this(照片2),当我再次点击它时,它会变回默认状态。所有这些功能都在FloatingActionButton class中设置。

它可以将UIView.animate(etc.)置于func searchBarShouldBeginEditing内,但我想知道是否可以调用UIView.animate(etc.)来减少冗余。

我现在要做的是,当我点击searchBar时,如果按钮处于旋转状态(照片2),它将旋转回原始状态(照片1)。我创造了:

@IBOutlet weak var mapTypeButton: FloatingActionButton!
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {

    UIView.animate(withDuration: 0.3, animations: {
        if self.mapTypeButton.transform == .identity {
            return
        } else {
            self.mapTypeButton.transform = .identity
    })
    return true
} 

它正是我正在寻找的。我只是将函数动作添加到新函数中,而不是调用函数。感谢所有帮助

2 个答案:

答案 0 :(得分:1)

听起来你并不真正理解面向对象的编程。

按钮对象不应存在于真空中。按钮是一个用户界面元素,它在某个地方属于屏幕。

此代码:

FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)

创建一个全新的FloatingActionButton,告诉它开始跟踪触摸,然后忘记它。它从来没有任何关系。没有人拥有它,所以当searchBarShouldBeginEditing函数返回时,按钮对象被取消分配。

这个按钮应该在某个地方显示在屏幕上,并跟踪触摸?如果是这样,您需要确定应该托管它的视图,并将其添加到该视图中。您还需要设置AutoLayout约束,以便将其置于其父视图中。

通常,在Storyboards中创建用户界面更容易(通常更好),并将它们放在视图层次结构中。但是,为了帮助您,您需要解释此按钮如何适合您的用户界面。

编辑:

根据您的更新,您希望更改故事板中按钮的设置。 (请注意,您尝试对该按钮进行的​​调用很可能是错误的,但是我会告诉您如何获得指针(IBOutlet)到按钮或其他视图的方式所以你可以配置它。)

您这样做的方法是在主编辑器窗口中设置故事板,然后打开包含"助理编辑器中按钮的视图控制器的源文件。"我建议在底部选择"助理编辑器"选项。

现在按住控制键,按下按钮,然后从按钮控制拖动到视图控制器类的内部,在顶部靠近其他变量。 Xcode将为您的按钮创建一个IBOutlet。在结果对话框中,更改" sender"的类型。到你的按钮类型(" FloatingActionButton"。)如果Xcode不允许你这样做,看看你是否可以选择" UIButton"代替。给它一个像" myFloatingButton"。

这样的名字

现在从

更改您的代码
FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)

myFloatingButton.beginTracking(touch: UITouch, with: UIEvent?)

您所做的是在视图控制器中创建实例变量myFloatingButton。当操作系统加载视图控制器的视图时,它将在该实例变量中保存指向浮动按钮的指针。加载视图后(调用viewDidLoad()方法后),您可以假设变量myFloatingButton指向您的按钮,然后可以调用您的方法进行配置。

编辑#2:

正如Hasan在他的回答中指出的那样,在你的按钮上拨打beginTracking(_:with:)是没有意义的。这是UIButton(实际上是按钮的祖先类UIControl)的方法,当用户触摸按钮时系统会在内部调用该方法。

您必须解释您尝试做的事情,以便我们能够帮助您做到这一点。

答案 1 :(得分:1)

我会详细说明@Duncan的回答。

重写的beginTracking函数不是代码调用的函数类型。它在事件发生时被调用。

显然你想使用FloatingActionButton类型的按钮。您需要做的是使用故事板将UIButton拖放到UIViewController。选择该按钮并将其类型更改为FloatingActionButton,方法是转到右侧窗格中的身份检查器,并将“类”字段中的值更改为FloatingActionButton

逻辑上,beginTracking将在事件发生时自动调用。除非,需要在FloatingActionButton

中启用布尔类型属性
相关问题