如何在 Swift iOS 中创建一个通用的弹出视图控制器

Posted

技术标签:

【中文标题】如何在 Swift iOS 中创建一个通用的弹出视图控制器【英文标题】:how to create a generic popup view controller in swift iOS 【发布时间】:2017-04-04 13:47:28 【问题描述】:

如何创建一个通用的弹出视图控制器,它可以被具有不同数据的多个视图控制器调用。 我创建了一个带有标签和按钮的 popupviewcontroller 类。 标签和按钮将根据来自不同视图控制器的调用具有不同的文本。 简而言之,创建可供多个视图控制器使用的通用弹出视图的正确可行方法是什么

class CustomPopUpViewController: UIViewController


@IBOutlet weak var vWCustomSubVw: UIView!
@IBOutlet weak var lblHeadingText: UILabel!
@IBOutlet weak var lblDescription: UILabel!
@IBOutlet weak var btnCustom: UIButton!

var strLblHeadingText = String()  // string for heading label
var strLblDescription = String() // string for description label
var strBtnCustom = String()// string for custom button

override func viewDidLoad() 
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.black.withAlphaComponent(0.2)

    self.showAnimate()



    lblHeadingText.text = strLblHeadingText
    lblDescription.text = strLblDescription
    btnCustom .setTitle(strBtnCustom, for: UIControlState.normal)



 func showAnimate()

    self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    self.view.alpha = 0.0;
    UIView.animate(withDuration: 0.25, animations: 
        self.view.alpha = 1.0
        self.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
    );



func removeAnimate()

    UIView.animate(withDuration: 0.25, animations: 
        self.view.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
        self.view.alpha = 0.0;
    , completion:(finished : Bool)  in
        if (finished)
        
            self.view.removeFromSuperview()
        
    );




我从另一个视图控制器中调用它,如下所示:-

 func btnInfoTapped()

    let customPopUpVC = UIStoryboard(name: "Course", bundle: nil).instantiateViewController(withIdentifier: "CustomPopUpViewController") as! CustomPopUpViewController
    self.addChildViewController(customPopUpVC)
    customPopUpVC.view.frame = self.view.frame
    self.view.addSubview(customPopUpVC.view)
    customPopUpVC.didMove(toParentViewController: self)




所以我想让它通用,说它是一个全局方法或从不同视图控制器调用同一类的东西

【问题讨论】:

欢迎来到 SO。您会发现,如果添加代码示例,通常会得到更好的响应。即使代码写得不好。你说你创建了一个类,作为例子添加。 你可以试试这个 pod (github.com/huynguyencong/EzPopup)。显示弹出任何控制器是通用的 【参考方案1】:

您可以创建一个通用的方法来呈现警报控制器

import Foundation
import UIKit

class AlertHelper: NSObject 

//Alert with title and dismiss button only
static func showAlertWithTitle(_ conroller: UIViewController, title: String, message: String = "" ,dismissButtonTitle: String, dismissAction:@escaping ()->Void) 

    let validationLinkAlert = UIAlertController(title:title, message:message, preferredStyle: .alert)
    let dismissAction = UIAlertAction(title: dismissButtonTitle, style: .default)  (action) -> Void in
        dismissAction()
    

    validationLinkAlert.addAction(dismissAction)
    conroller.present(validationLinkAlert, animated: true, completion: nil)


//Alert with title with message
static func showALertWithTitleAndMessage(_ controller: UIViewController, title: String, message: String, dismissButtonTitle: String, okButtonTitle: String, dismissAction:@escaping ()-> Void, okAction:@escaping ()-> Void) 

    let validationLinkAlert = UIAlertController(title:title, message:message, preferredStyle: .alert)

    let dismissAction = UIAlertAction(title: dismissButtonTitle, style: UIAlertActionStyle.default)  (action) in
        dismissAction()
    

    let okAction = UIAlertAction(title: okButtonTitle, style: UIAlertActionStyle.default)  (action) in
        okAction()
    

    validationLinkAlert.addAction(dismissAction)
    validationLinkAlert.addAction(okAction)

    controller.present(validationLinkAlert, animated: true, completion: nil)



从你的 Viewcontroller 调用这个函数

AlertHelper.showAlertWithTitle(self, title: message, dismissButtonTitle: "OK")  () -> Void in

    

【讨论】:

要求是自定义 UI 有很多可用的开源代码,您可以使用其中的一种,或者通过获取灵感来创建自己的。检查这个github.com/Orderella/PopupDialog【参考方案2】:

我认为这个 pod 会帮助你 EzPopup (https://github.com/huynguyencong/EzPopup)。您可以轻松地将视图控制器显示为弹出窗口:

// init YourViewController
let contentVC = ...

// Init popup view controller with content is your content view controller
let popupVC = PopupViewController(contentController: contentVC, popupWidth: 100, popupHeight: 200)

// show it by call present(_ , animated:) method from a current UIViewController
present(popupVC, animated: true)

【讨论】:

以上是关于如何在 Swift iOS 中创建一个通用的弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

交互式地图,如何在 symfony 中创建从地图标记的弹出窗口到模板的链接

是否可以在 Swift 中创建具有 Self 或关联类型要求的通用计算属性,如果可以,如何?

iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮

swift 在swift中创建一个警报视图弹出窗口

您将如何在 Android 中创建弹出视图,例如 Facebook 评论?

创建没有导航栏按钮的弹出菜单