web-dev-qa-db-ja.com

迅速。 UITableViewCell階層の適切な初期化

[UITableViewCell] <-[genericCell] <-[Cell1]、[Cell2]、[Cell3]

こんにちは。上の階層を想像してください。私のコードでは、タイプgenericCellのオブジェクトを正確に持っていませんが、このクラスはいくつかのプロパティを共有しています。

私のコードにはどのようなデザインのinitsが必要ですか? genericCellの構造は次のとおりです。

_override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    //my stuff (initializing shared properties)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

}
_

しかし、_Cell1_はどうですか? _Cell1_インスタンスの初期化を通じて「私のもの」操作のためにgenericCellinit(style: UITableViewCellStyle, reuseIdentifier: String?)を呼び出すにはどうすればよいですか?今、彼らは実行されません。


[〜#〜]編集[〜#〜]

_override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let typeOfCell = FbDataManager.sharedInstance.posts[indexPath.row][FbDataManager.sharedInstance.typeParameter] as! String

        switch typeOfCell {
            case self.linkTypeOfPost:

                var cell = tableView.dequeueReusableCellWithIdentifier(self.linkCellIdentifier) as? FbLinkPostViewCell
                if cell == nil {
                    cell = FbLinkPostViewCell.init(style: .Default, reuseIdentifier: self.linkCellIdentifier)
                }
//...
_

また会ったね。これはtableViewのデリゲートの一部ですが、Abhinavのinitをコードにコピーアンドペーストしましたが、これらのinitは機能していません。 (コンソールへの出力なし)

12
drewpts

あなたの質問を正しく理解しているとは思いませんが、クラス間の継承についてのようです。したがって、基本的には、「UITableViewCell」から継承する「GenericCell」クラスと、「GenericCell」からそれぞれ継承する「CellOne」、「CellTwo」、および「CellThree」クラスがあります。 init with styleを実行する場合、これを設定する1つの方法は次のようになります。

class GenericCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        // code common to all your cells goes here
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

class CellOne: GenericCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier) // the common code is executed in this super call
        // code unique to CellOne goes here
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

次に、次のように、テーブルビューのデータソースにCellOneのインスタンスを作成します。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCellWithIdentifier("cell")
    if (cell == nil) {
        cell = CellOne.init(style: .Default, reuseIdentifier: "cell")
    }
    return cell!
}

各インスタンスについて、最初に「GenericCell」で行われた共通のセットアップを実行し、次に「CellOne」で一意のセットアップを実行します。 「CellTwo」と「CellThree」はそれに応じて設定されます。

[〜#〜]編集[〜#〜]

3つのセルタイプすべてのインスタンスを構成する方法のより具体的な例:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        // you need to write a method like this to figure out which type you need:
        let cellID = self.cellIDForIndexPath(indexPath) // returns either "cell1", "cell2" or "cell3"

        // dequeue or init a cell of the approriate type
        var cell = tableView.dequeueReusableCellWithIdentifier(cellID)
        if (cell == nil) {
            switch cellID {
                case "cell1": cell = CellOne.init(style: .Default, reuseIdentifier: "cell")
                case "cell2": cell = CellTwo.init(style: .Default, reuseIdentifier: "cell")
                case "cell3": cell = CellThree.init(style: .Default, reuseIdentifier: "cell")
                default: cell = UITableViewCell()
            }

        }

        // configure the individual cell if needed (you need to implement methods + logic here that fit your data)
        (cell as! GenericCell).configureForData(self.dataForIndexPath(indexPath))

        return cell!
    }
13
Gamma

これは私があなたが言及した階層をどのように置くかです:

ステップ1:ジェネリックセルクラスを作成

class GenericCell : UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        print("Generic Cell Initialization Done")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

ステップ2:特定のセル1クラスを作成します。

class MyCell1 : GenericCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        print("MyCell1 Initialization Done")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

ステップ3:特定のセル2クラスを作成します。

class MyCell2 : GenericCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        print("MyCell2 Initialization Done")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

ステップ4:特定のセル3クラスを作成します。

class MyCell3 : GenericCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        print("MyCell3 Initialization Done")
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

ステップ5:最後に、次のようにセルを使用します。

let cell1 = MyCell1.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell1")
let cell2 = MyCell2.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell2")
let cell3 = MyCell3.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell3")

PS:これにより、一般的なセルと特定のセルのプロパティの設定が保証されます。

編集:cellForRowAtIndexPathでセルを使用する方法は次のとおりです:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell1 = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as MyCell1

        if cell1 == nil {
            cell1 = MyCell1.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell1")
        }

        // Do your cell property setting

        return cell1
    } else if indexPath.section == 1 {
        let cell2 = tableView.dequeueReusableCellWithIdentifier("cell2", forIndexPath: indexPath) as MyCell2

        if cell2 == nil {
            cell2 = MyCell2.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell2")
        }

        // Do your cell property setting

        return cell2
    } else {
        let cell3 = tableView.dequeueReusableCellWithIdentifier("cell3", forIndexPath: indexPath) as MyCell3

        if cell3 == nil {
            cell3 = MyCell3.init(style: UITableViewCellStyle.Default, reuseIdentifier: "cell3")
        }

        // Do your cell property setting

        return cell3
    }
}
4
Abhinav