创建一个类的所有对象的数组

3
有没有一种方法可以创建一个包含所有颜色对象的数组?这样,每次添加新颜色时,它也会自动添加到数组中?
class Colours {
    var colourName: String
    var colourShades: [String?]


    init(colourName: String, colourShades: [String?]) {
        self.colourName = colourName
        self.colourShades = colourShades
    }


}

var red = Colours(colourName: "Red", colourShades: ["Crimson", "Cherry", "Rose"])


var blue = Colours(colourName: "blue", colourShades:["Ice", "Baby", "Royal"])

为了给大家提供一些背景,我正在尝试开发一个包含颜色表的iOS应用程序。当用户点击颜色后,它将带他们到另一个颜色阴影表。

我需要颜色数组以自动填充表格行,当用户添加新颜色时,它会自动添加新行。

4个回答

3
使用在Colours中定义的静态数组来存储所有已创建的颜色。您可以从应用程序中的任何位置访问此数组,如Colours.allColours
创建一个名为ColourWatcher的协议,并在Colours上创建一个静态delegate,用于通知添加颜色的类。
让您的tableView实现ColourWatcher并将其添加为delegate。然后,当添加颜色时,将在TableViewController中调用方法newColourAdded,您可以重新加载数据。
另外,建议将颜色阴影数组仅设置为[String],而不是使用可选项。空数组表示您没有色调。
protocol ColourWatcher: class {
    func newColourAdded(colour: Colour)
}

class Colours {
    static var allColours: [Colours] = []
    static weak var delegate: ColourWatcher?

    var colourName: String
    var colourShades: [String]

    init(colourName: String, colourShades: [String]) {
        self.colourName = colourName
        self.colourShades = colourShades
        Colours.allColours.append(self)
        Colours.delegate?.newColourAdded(colour: self)
    }
}

class MyTableViewController: UIViewController, ColourWatcher {

    func viewDidLoad() {
        super.viewDidLoad()
        Colours.delegate = self
    }

    func newColourAdded(colour: Colour) {
        // reload table view or just insert a new row
        // using the passed in colour
    }
}

谢谢,这非常有帮助。我在我的tableView函数中遇到了以下错误:func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) cell.textLabel?.text = Colours.allColours[indexPath.row] return cell }错误是无法将类型为'Colours'的值分配给类型'String?'。还有,只有当我在newColourAdded函数中将Color更改为Colours时才起作用,是吗? - Ross Morey
1
ColourColours只是一个打字错误。虽然你的类只代表一种颜色,所以它应该被命名为Colour。尝试使用cell.textLabel?.text = Colours.allColours[indexPath.row].colourName - vacawama
那样就解决了错误,我将来会记住的。现在我没有错误,但表格显示为空,尽管我已经向类中添加了一个对象。我已经在TableController中添加了行数和行内容 - 使用常规格式而没有出错。我是否漏掉了什么?很抱歉让您不舒服,我是新手,很难理解它! - Ross Morey
1
你应该在 numberOfRowsInSection 中返回 Colours.allColours.count - vacawama
这就是我所拥有的,但仍然为空。无论我做什么,表格都保持为空。我已经尽我所能尝试了各种方法,但似乎没有什么区别:/ 不管怎样,还是要感谢你的帮助! - Ross Morey
描述您的应用程序流程。有多少个ViewControllers?如何添加新颜色? - vacawama

1
有没有一种方法可以创建一个包含所有颜色对象的数组?这样每次添加新颜色时,它也会自动添加到数组中?
您可以在类中声明一个数组,并像这样追加。
lazy var colorList = {
  Colours()
}()

我需要颜色数组,以便自动填充表格的行,当用户添加新颜色时,它将自动添加新行。
func addColor() {
   colorList.append(Colours(colourName: "Red", colourShades: 
   ["Crimson", "Cherry", "Rose"]))
   colorList.append(Colours(colourName: "blue", colourShades:["Ice", 
   "Baby", "Royal"]))
}

一旦您在添加颜色时调用上述方法,然后刷新表格,就可以在表格行中显示新的颜色信息。
为了提供一些背景,我正在尝试开发一个IOS应用程序,其中包含一张颜色表。然后当用户点击一种颜色时,它将会带他们进入另一个表格,该表格具有该颜色的不同深度。
现在在您的tableView的cellForRowAtIndexPath方法中,您只需要访问以上的colorList数组,并获取colorname并在您的表格上显示。
当用户点击单元格时,在您的didSelectRowAtIndexPath方法中加载另一个类并传递以上colorList数组信息到该类,并为了显示颜色阴影,从colorList数组中访问colourShades信息。

1

在我看来,您希望在整个应用程序中保留状态。

解决您的问题的最佳方法是创建一个Singleton实例。

例如:

class ColoursSharedModel {

    static let shared : ColoursSharedModel = ColoursSharedModel()

    var choosenColors : [Colors] = []
    private init() {}
}

稍后,您应该添加


ColoursSharedModel.shared.choosenColors.append(self)

在你的颜色初始化中。

1

1) 添加您自己的通知名称

extension NSNotification.Name {

    // 1
    static let NewColourAdded = NSNotification.Name(rawValue: "NewColourAdded")
}

2) 将对象池(静态变量all)的访问修饰符设置为private(set)

3) 向对象池添加已初始化的颜色

4) 发布您的通知

class Colours {

    // 2
    private(set) static var all: [Colours] = []

    var name: String
    var shades: [String]

    init(name: String, shades: [String]) {
        self.name = name
        self.shades = shades

        // 3
        Colours.all.append(self)

        // 4
        NotificationCenter.default.post(
            name: .NewColourAdded, 
            object: self
        )
    }
}

使用方法

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(
            self, 
            selector: #selector(self.onNewColourAdded), 
            name: .NewColourAdded, 
            object: nil
        )
    }

    func onNewColourAdded(notification: Notification) {
        guard let newColours = notification.object as? Colours else { 
            return 
        }

        // Do something
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接