Ios 如何在swift中组织在多个视图控制器中重用的代码?

Ios 如何在swift中组织在多个视图控制器中重用的代码?,ios,swift,xcode,Ios,Swift,Xcode,目前,我有两个tableview,它们显示相同的信息,但有一些细微的差异。这两个不同的表视图具有单独的视图控制器和单独的故事板。我想知道是否有一种方法可以将类似的代码和故事板合并在一起,从而创建一个更有组织的项目 这是我的第一个视图控制器代码 import UIKit class GoalsViewController: UIViewController { @IBOutlet weak var GoalsTableView: UITableView! var firstGoals: [S

目前,我有两个tableview,它们显示相同的信息,但有一些细微的差异。这两个不同的表视图具有单独的视图控制器和单独的故事板。我想知道是否有一种方法可以将类似的代码和故事板合并在一起,从而创建一个更有组织的项目

这是我的第一个视图控制器代码

import UIKit

class GoalsViewController: UIViewController {

@IBOutlet weak var GoalsTableView: UITableView!

var firstGoals: [String] = ["Read", "Write", "Think"]
var secondGoals: [String] = ["Run", "Go to the gym"]
var Goals: [String] = []
var valueToPass = ""
let theEmptyModel: [String] = ["No data in this section."]

override func viewDidLoad() {
    super.viewDidLoad()

    GoalsTableView.delegate = self
    GoalsTableView.dataSource = self
}

func showGoalSelected() {
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {
        let popUp = GoalSelectedPopUp()
        self.view.addSubview(popUp)
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "activeGoalsSegue" {
    let viewController = segue.destination as! ActiveGoalsViewController
    viewController.Goals[0].append(valueToPass)
    }
}

}

extension GoalsOneViewController: UITableViewDataSource, UITableViewDelegate {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return Goals.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "GoalCell_1", for: indexPath)
    cell.textLabel?.text = Goals[indexPath.row]
    cell.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
    cell.textLabel?.numberOfLines = 3
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    valueToPass = Goals[indexPath.row]
    performSegue(withIdentifier: "activeFirstGoalsSegue", sender: self)
    if indexPath.section == 0 {
        if Goals.count != 0 {
            Goals.remove(at: indexPath.row)
            showGoalSelected()
            tableView.reloadData()
        }
    }
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "Goals"
}

}
这是故事板的图像。


如何将这两个项目结合起来,使我只有一个故事板和一个视图控制器?

实现这一点的方法是使您的视图控制器更加抽象。不需要像firstGoals和secondGoals那样设置数组,您可以只设置“目标”。使用目标数组可以填充ViewController。您可以首先将目标设置为等于一个名为firstGoals的数组,该数组中包含您的第一个目标,即goals=firstGoals。然后,无论用户采取什么操作来访问第二个ViewController,比如单击按钮,您都可以对其进行设置,这样您就可以将您的目标数组设置为secondGoals数组。然后通过执行TableView.reloadData()重新加载TableView


这将只产生一个故事板和一个ViewController类。

谢谢。我已经更新了我的代码以匹配当前的代码。但是,我很难根据用户选择的内容更改值。你能看一下吗?@k-12345你得多给我一些信息。具体来说,您在更换时遇到了什么困难?“价值”是什么?用户选择的是什么?程序的整体视图有一个故事板,用户可以在其中选择室内或室外目标。在选择之后,他们将被引导到一个表视图,该表视图为他们提供该受尊重类别中的特定目标。从那里,单元格将“值”传递给一个新的表视图。@k-12345您可以在屏幕上选择是否执行室内或室外目标,在进入该屏幕之前,根据单击的按钮,将特定的室内或室外数组传递给GoalsViewController中保存的数组。如果在GoalsViewController中有一个常规的“goals”数组,那么当您将一个数组传递给该ViewController时,它将自动填充,因为您将从“goals”数组中的数据填充TableView,您在继续之前将该数组传递给GoalsViewController。@k-12345关键是要有一个“goals”在GoalsViewController中的数组,在转到GoalsViewController之前,根据在上一个ViewController(室内或室外)中单击的按钮填充该数组。