使用自定义按钮类调用特定视图控制器

时间:2016-11-02 19:05:09

标签: ios swift uibutton viewcontroller uibarbuttonitem

大家。我有一个自定义类的配置文件按钮,用于在单击后显示ProfileViewController。 ProfileButton继承自UIButton,并显示在多个视图控制器的导航栏上。虽然我知道我可以为每个VC的代码添加一个函数,但我更喜欢以更优雅的方式执行此操作。我到目前为止所尝试的是: -

  1. 从ProfileButton类中调用ProfileViewController:我无法使用storyboard.instantiateViewControllerWithIdentifier引用ProfileViewController。

  2. 使用委托:这仍然意味着向每个VC添加代码。提前致谢。

  3. 我已经发布了按钮类的代码。我正在寻找一种方法将代码放在一个仍能达到此结果的位置。

    class ProfileButton: UIButton {
    
        override func awakeFromNib() {
    
            self.addTarget(self, action: #selector(self.profileButtonPressed), forControlEvents: .TouchDown)
    
        }
    
    }
    

    修改: -

    问题不在于提出或解雇VC。我只是试图找到使用配置文件按钮呈现ProfileVC的最优雅方式,而不将self.presentViewController(animated:true,completion:nil)添加到ViewController1,ViewController2,ViewController3等。

    这是一张图片,展示了它的设置: -

    Illustration

4 个答案:

答案 0 :(得分:0)

好像你想知道如何制作一个屏幕系统,所以这就是我通常的做法。

我使用UIView“isHidden”的属性,它显示和隐藏视图。隐藏视图时,视图不会响应可能附加到viewController的触摸(UIGestureRecognizers)。因此,当您想要从另一个viewController(或UIButton)切换到新视图时,只需将当前视图设置为隐藏,并在要打开的新视图上将isHidden设置为false。

我通常也会制作一个用于设置视图的“show”功能。如果您想使用此功能或内置功能,请由您决定。

答案 1 :(得分:0)

您可以通过为所有视图控制器提供基类来实现此目的,该控制器的导航栏带有' profile'按钮。

在基类中编写配置文件按钮操作,扩展类中的任何操作都将调用基类方法。

答案 2 :(得分:0)

我的问题可能有点模糊。但我听到的是:

  • (1)您在导航栏中嵌入了多个视图(带有视图控制器)。

  • (2)此导航栏上有一个配置文件按钮,它是UIButton或UIBarButton的子类。 (你的代码暗示它是UIButton。无论如何。)

  • (3)当点击此配置文件按钮时,您希望显示配置文件视图(使用它自己的视图控制器)和......?我猜想(a)你想要个人资料按钮,甚至导航栏可见,以及(b)你想在完成时返回第1项。

  • (4)最后,你想让#2和#3从#1中分离出来。也就是说,您希望只对此“配置文件”机制进行一次编码。

如果是这种情况,我会问自己两件事:

  • (1)Apple如何做到这一点?也许类似于应用程序内的“设置”视图。

  • (2)另一个应用程序是如何做到的?

我的建议:

  • (1)你能使你的个人资料视图模态吗?这将是一种“强迫”用户点击某些内容以清除它的方法。

  • (2)当可见时,您是否可以调用配置文件视图并相应地操作导航栏?在这里,我想要隐藏整个栏,或者用另一个按钮换掉配置文件按钮(可以通过各种方式完成)。

无论哪种方式,您都可以将所有代码有效地放在一个位置,并且各个视图控制器中唯一需要的代码是确保在视图可见时显示的导航栏设置正确。

答案 3 :(得分:0)

您可以在profileButtonPressed方法

中使用类似的内容
if let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ProfileViewController") as? ProfileViewController {
    UIApplication.topViewController()?.present(vc, animated: true, completion: nil)
}

像这样实施topViewController方法。

extension UIApplication {
class func topViewController() -> UIViewController? {
    return UIApplication.topViewController(base: nil)
}
class func topViewController(base: UIViewController?) -> UIViewController? {
    var baseView = base
    if baseView == nil {
        baseView = (UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController
    }
    if let vc = baseView?.presentedViewController {
        return UIApplication.topViewController(base: vc)
    } else {
        return baseView;
    }
}
}

如果您想要进入顶部导航视图,请更改topViewController方法以搜索顶部呈现的navcontroller,然后搜索其中的当前视图,然后将其推入其中。