两个UIViews共享ALMOST相同的UIViewController

时间:2018-02-23 08:50:32

标签: swift xcode uiview uiviewcontroller

我有一个"买"页面和"销售"产品页面。他们共享SAME UIViewController,除了在一个UIViewController中它显示待售物品,另一个用于购买。 (另一个区别是一个按钮 - 它的字符串A显示在一个中,B显示在另一个中。

我可以让他们与这些变化共享相同的UIViewController吗?我可以为每个视图定义一些参数吗?

3 个答案:

答案 0 :(得分:1)

您可以使用具有两个非常不同的子类的基本UIViewController。将所有逻辑放在基础中,只考虑子类中的差异......

class BaseVC: UIViewController {
    @IBOutlet weak var button: UIButton!
    var items: [String] = []
    @IBAction func buttonPressed(_ sender: Any) {
        // do stuff
    }
    // add all of your tableView or similar common stuff here...
}
class AVC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.button.titleLabel?.text = "A"
        self.items = ["Sell1", "Sell2"]
    }
}
class BVC: BaseVC {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.button.titleLabel?.text = "B"
        self.items = ["Buy1", "Buy2"]
    }
}

答案 1 :(得分:1)

使用BaseViewController并使其成为新视图控制器的父类

如下所示:

BaseController: 导入UIKit

class SettingsController: BaseViewController {


override func viewDidLoad() {
    super.viewDidLoad()//This calls everything you wrote as init code for BaseController

    //Write any view controller specific init code here
}

//If you have any other settings controller specific code, write here
}

为每个视图控制器创建单独的类,并根据需要进行修改:

//Initiate your controller like this from the previous controller
@IBAction func goToSettingsController(_ sender: Any) {
    let baseController = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ControllerID") as! BaseController
    baseController.id = "Settings"
    self.present(baseController, animated: true, completion: nil)

}

@IBAction func goToAboutController(_ sender: Any) {
    let baseController = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ControllerID") as! BaseController
    baseController.id = "About"
    self.present(baseController, animated: true, completion: nil)
}

由于我没有看到你的代码,我不能确定这是否是正确的方法。这种方法仍然意味着您不必为每个视图控制器类重写代码并仍然保持干净。 当您按代码进行布局和视图时,首选上述方法。

如果你正在使用故事板并根据你的具体需要,我建议你做一些这样的事情:

var id: String!
@IBOutlet weak var backGround: UIView!


override func viewDidLoad() {
    super.viewDidLoad()
    customInit()
}

func customInit(){
    switch id{
    case "Settings":
        self.backGround.backgroundColor = .purple //Any controller specific code
        break
    case "About":
        self.backGround.backgroundColor = .green //Any controller specific code
        break
    default:
        break
    }

}

在你的BaseController中:     class BaseController:UIViewController {

iconUrl: the URL or file path to the icon image

}

如前所述,您不需要三个单独的类,但您可以将ViewControllers用于BaseController类。

答案 2 :(得分:1)

创建一个xib文件, 在其中添加一个视图, 在具有不同按钮的不同功能的视图控制器中使用该视图

观看此视频以获取帮助:https://www.youtube.com/watch?v=tvQxXoV527w&t=754s