动态分配 ViewController 给 Navigate

Dynamically assign ViewController to Navigate

在我的例子中,我有 UITableView查看全部 按钮,用于在单独的屏幕中列出所有项目。所以我在 cellForRowAt 中为 UIButton 操作方法添加了目标。现在我正在做的动作方法:

@IBAction func btnViewAllOffer(_ sender: UIButton) {
        let buttonPosition = sender.convert(CGPoint.zero, to: self.tblOfferView)
        let indexPath = self.tblOfferView.indexPathForRow(at: buttonPosition)

        if indexPath != nil {

            if let type = self.homeData[indexPath!.section].type {
                if type == HomeDataType.SponserProduct.rawValue {
                    let vc1 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController1") as! ViewController1
                    if let title = self.homeData[indexPath!.section].title {
                        vc1.title = title
                    }
                    self.navigationController?.pushViewController(vc1, animated: true)
                } else if type == HomeDataType.Offer.rawValue {
                    let vc2 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
                    if let title = self.homeData[indexPath!.section].title {
                        vc2.title = title
                    }
                    self.navigationController?.pushViewController(vc2, animated: true)
                } else if type == HomeDataType.BestSeller.rawValue {
                    let vc3 = self.storyboard?.instantiateViewController(withIdentifier: "ViewController3") as! ViewController3
                    if let title = self.homeData[indexPath!.section].title {
                        vc3.title = title
                    }
                    self.navigationController?.pushViewController(vc3, animated: true)
                }
            }
        }
    }

我需要什么,有没有什么方法可以最小化代码并动态分配视图控制器,这样就不需要实例化每个视图控制器并每次都推送它们? 类似于:

var vc = UIViewController()
if let type = self.homeData[indexPath!.section].type {
    if type == HomeDataType.SponserProduct.rawValue {
        vc = ViewController1()
    }
    else if type == HomeDataType.Offer.rawValue {
        vc = ViewController2()
    } else if type == HomeDataType.BestSeller.rawValue {
        vc = ViewController3()
    }
}
self.navigationController?.pushViewController(vc, animated: true)

1: 创建一个结构并为其赋值。

    struct TitleDetails { 
         static var title : String = ""
    }

2: 创建 viewController 的扩展并使用它来避免代码重复。

    extension UIViewController {

        func pushVC(_ vcName : String) {
            let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: vcname)
            self.navigationController?.pushViewController(vc, animated: true)
        }
    }

3: 现在你可以直接调用它了,

TitleDetails.title = yourTitleValue
self.pushVC("ViewController1")

并在目标视图控制器的 ViewDidLoad() 方法中,

self.title = TitleDetails.title

使用 protocol (SimilarViewController) 定义通用属性,如 title:

protocol SimilarViewController {
    var title: String? { get set }
}

class ViewController1: UIViewController, SimilarViewController {
    var title: String?
}
class ViewController2: UIViewController, SimilarViewController {
    var title: String?
}
class ViewController3: UIViewController, SimilarViewController {
    var title: String?
}


@IBAction func btnViewAllOffer(_ sender: UIButton) {
        let buttonPosition = sender.convert(CGPoint.zero, to: self.tblOfferView)
        let indexPath = self.tblOfferView.indexPathForRow(at: buttonPosition)

        if indexPath != nil {

            if let type = self.homeData[indexPath!.section].type {
                var vcGeneric: SimilarViewController?

                if type == HomeDataType.SponserProduct.rawValue {
                    vcGeneric = self.storyboard?.instantiateViewController(withIdentifier: "ViewController1") as! ViewController1
                } else if type == HomeDataType.Offer.rawValue {
                    vcGeneric = self.storyboard?.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
                } else if type == HomeDataType.BestSeller.rawValue {
                    vcGeneric = self.storyboard?.instantiateViewController(withIdentifier: "ViewController3") as! ViewController3
                }


                if let title = self.homeData[indexPath!.section].title {
                    vcGeneric?.title = title
                }

                if let vcGeneric = vcGeneric  as? UIViewController {
                    self.navigationController?.pushViewController(vcGeneric, animated: true)
                }
            }
        }
}

创建 BaseViewController 并从 BaseViewController

派生其他 ViewController
class BaseViewController: UIViewController {
    var viewTitle = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

    }

    func pushVC(_ vcName : String) {
        let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)

        self.navigationController?.pushViewController(vc, animated: true)
    }
}

并在 ViewController 上使用以下代码,您需要像:

@IBAction func btnViewAllOffer(_ sender: UIButton) {
        let buttonPosition = sender.convert(CGPoint.zero, to: self.tblOfferView)
        let indexPath = self.tblOfferView.indexPathForRow(at: buttonPosition)

        if indexPath != nil {

            if let type = self.homeData[indexPath!.section].type {
                self.viewTitle = self.homeData[indexPath!.section].title
                if type == HomeDataType.SponserProduct.rawValue {
                    self.pushVC("ViewController1")
                } else if type == HomeDataType.Offer.rawValue {
                    self.pushVC("ViewController2")
                } else if type == HomeDataType.BestSeller.rawValue {
                    self.pushVC("ViewController3")
                }
            }
        }
    }