首页 > 解决方案 > 从自定义视图控制器继承以使相似视图的行为多态

问题描述

我在重用代码(故事板和实现)以在我的应用程序中拥有两个相似视图时遇到了问题。它们只是在细节上有所不同,例如为表格视图附加模型和处理一些用户交互。为了在它们之间快速切换,我想将它们嵌入到选项卡栏控制器中,并且当用户点击另一个选项卡时,我将更改布局和处理事件的方式。我遇到的第一个问题是有两个选项卡 - 所以我希望我可以在情节提要中从选项卡栏到我的控制器进行两个 segues 并以编程方式重命名它们。好的,下一个问题是继续在故事板中设置一个自定义类 - 我希望我可以在这里设置一个超级视图控制器类名称并在代码中操作它。最后,在这种情况下如何连接 UI 元素?我试图将它们与超类联系起来,但它不是

在此处输入图像描述

class NavControllerViewController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabBar = storyboard.instantiateViewController(identifier: "TabBar") as? TabBarViewController
        let first = storyboard.instantiateViewController(identifier: "Base") as? FirstViewController
        let second = storyboard.instantiateViewController(identifier: "Base") as? SecondViewController
        
        tabBar!.setViewControllers([first!, second!], animated: true)
    }
}
class TabBarViewController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tabBar.items?.first?.title = "First"
        self.tabBar.items?.last?.title = "Last"
        self.delegate = self        
        // Do any additional setup after loading the view.
    }
    
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController is FirstViewController {
            debugPrint("FIRST CONT")
        } else if viewController is SecondViewController {
            debugPrint("SECOND CONT")
        }
    }
}
class BaseViewController: UIViewController {

    @IBOutlet weak var customButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func didTouchCustomButton(_ sender: UIButton) {
        debugPrint("BASE")
    }
}
class FirstViewController: BaseViewController {
    
    @IBAction override func didTouchCustomButton(_ sender: UIButton) {
        super.didTouchCustomButton(sender)
        debugPrint("FIRST")
    }
}
class SecondViewController: BaseViewController {
    
    @IBAction override func didTouchCustomButton(_ sender: UIButton) {
        super.didTouchCustomButton(sender)
        debugPrint("SECOND")
    }
}

这是我的代码和我的这个任务的故事板。当我点击一个按钮时,我得到一个文本“BASE”,所以多态性对我不起作用。是否可以将我的控制器设置为标签栏,然后正确处理视图控制器?我的意思是:当我在选项卡 First -> 写“FIRST”时,在第二个 -> “SECOND” 在点击按钮后?或者我应该为我的问题找到不同的解决方案?

标签: iosuiviewcontrolleruinavigationcontrollerpolymorphismuitabbarcontroller

解决方案


推荐阅读