就我而言,我有UITableView查看所有按钮以在单独的屏幕中列出所有项目。所以我在UIButton中添加了cellForRowAt操作方法的目标。现在我在行动方法中正在做的事情:

@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)

最佳答案

使用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)
                }
            }
        }
}

关于ios - 动态分配ViewController进行导航,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59837616/

10-09 17:15