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

Calling a specific view controller with a custom button class

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

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

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

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

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

看来你想知道如何制作屏幕系统,所以我通常是这样做的。

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

我通常也会创建一个 "show" 函数来设置视图。是否要使用此功能或内置功能取决于您。

您可以通过为所有具有带 'profile' 按钮的导航栏的视图控制器设置一个基础 class 来做到这一点。

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

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

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

  • (2) 这个导航栏上有一个配置文件按钮,它是UIButton 或UIBarButton 的子类。 (您的代码表明它是 UIButton。没关系。)

  • (3) 当点击这个配置文件按钮时,您希望显示一个配置文件视图(带有它自己的视图控制器)并且...?我猜 (a) 您 想要个人资料按钮,甚至导航栏可见,并且 (b) 您想要 return 到第 1 项完成后。

  • (4) 最后,您希望将项目 #2 和 #3 从 #1 中分离出来。也就是说,您希望为此 "profile" 机制编写一次且仅一次。

如果是这样的话,我会问自己两件事:

  • (1)苹果是怎么做到的?可能类似于应用内的 "settings" 视图。

  • (2)另一个app是怎么做到的?

我的建议:

  • (1) 能否将个人资料视图设为模态?这将是 "force" 用户点击某些内容以清除它的一种方式。

  • (2) 能否调用profile view 并在可见时适当操作导航栏?在这里,我在考虑要么隐藏整个栏,要么用另一个按钮替换配置文件按钮(可以通过多种方式完成)。

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

你可以在 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方法来搜索top presented navcontroller,然后在其中搜索当前视图,然后推入它。