création de cellules tableview personnalisées dans swift

j'ai une classe de cellules sur mesure avec quelques IBOutlets. J'ai ajouté la classe au storyboard. J'ai branché tous mes points de vente. ma fonction cellForRowAtIndexPath ressemble à ceci:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as SwipeableCell

        cell.mainTextLabel.text = self.venueService.mainCategoriesArray()[indexPath.row]

        return cell
    }

voici ma classe de cellules personnalisée:

class SwipeableCell: UITableViewCell {
    @IBOutlet var option1: UIButton
    @IBOutlet var option2: UIButton
    @IBOutlet var topLayerView : UIView
    @IBOutlet var mainTextLabel : UILabel
    @IBOutlet var categoryIcon : UIImageView

    init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)


    }
}

quand j'exécute l'application, toutes mes cellules sont vides. J'ai déconnecté self.venueService.mainCategoriesArray() et il contient toutes les chaînes. J'ai aussi essayé de mettre une chaîne réelle égalité de l'étiquette, et que produit le même résultat.

Qu'est-ce que je rate? Toute aide est appréciée.

36
demandé sur Juan Boero 2014-06-11 23:20:00

10 réponses

Custom Vue De La Table De La Cellule Exemple

Testé avec Xcode 9 et Swift 4

l'asker de la question originale a résolu leur problème. J'ajoute cette réponse comme un mini projet d'exemple autonome pour d'autres qui essaient de faire la même chose.

Le projet fini devrait ressembler à ceci:

enter image description here

créer un nouveau projet

il peut être juste une Application de vue unique.

ajouter le code

ajoutez un nouveau fichier Swift à votre projet. Appelez-le MyCustomCell.Swift. Cette classe tiendra les prises pour les vues que vous ajoutez à votre cellule dans le storyboard.

import UIKit
class MyCustomCell: UITableViewCell {
    @IBOutlet weak var myView: UIView!
    @IBOutlet weak var myCellLabel: UILabel!
}

nous allons connecter ces prises plus tard.

Open ViewController.swift et faire bien sûr, vous avez le contenu suivant:

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]

    // These are the colors of the square views in our table view cells.
    // In a real project you might use UIImages.
    let colors = [UIColor.blue, UIColor.yellow, UIColor.magenta, UIColor.red, UIColor.brown]

    // Don't forget to enter this in IB also
    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell

        cell.myView.backgroundColor = self.colors[indexPath.row]
        cell.myCellLabel.text = self.animals[indexPath.row]

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }
}

Installation de la table de montage séquentiel

ajoutez une vue de Table à votre contrôleur de vue et utilisez la disposition automatique pour le épingler aux quatre côtés du contrôleur de vue. Puis faites glisser une cellule de vue de Table sur la vue de Table. Et puis faites glisser une vue et une étiquette sur la cellule Prototype. (Vous pouvez avoir besoin de sélectionner la cellule de vue de Table et mettre manuellement la hauteur de la rangée à quelque chose de plus grand dans l'inspecteur de taille pour que tu aies plus de place pour travailler.) Utilisez la mise en page automatique pour fixer la vue et L'étiquette de la façon dont vous les voulez disposés dans la vue de contenu de la cellule de vue de Table. Par exemple, j'ai fait mon point de vue être 100x100.

enter image description here

autres réglages IB

nom de classe personnalisé et Identificateur

sélectionnez la case de vue de la Table et la classe personnalisée doit être MyCustomCell (le nom de la classe dans le fichier Swift que nous avons ajouté). Définissez aussi L'identifiant comme cell (la même chaîne que celle que nous avons utilisée pour le cellReuseIdentifier dans le code ci-dessus.

enter image description here

raccorder les sorties

  • traînée de contrôle de la vue de la Table dans le storyboard à la variable tableView dans le ViewController du code.
  • faites la même chose pour la vue et L'étiquette dans votre cellule Prototype aux variables myView et myCellLabel dans la classe MyCustomCell .

fini

C'est ça. Vous devriez être capable de mener votre projet maintenant.

Notes

  • les vues colorées que j'ai utilisées ici pourraient être remplacées par n'importe quoi. Un exemple évident serait un UIImageView .
  • si vous essayez simplement d'obtenir un TableView à travailler, voir cet exemple encore plus basique .
  • si vous avez besoin d'une vue de Table avec des hauteurs de cellules variables, voir cet exemple .
81
répondu Suragch 2017-12-16 00:19:14

c'est pour ceux qui travaillent avec custom cell .xib

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

    let identifier = "Custom"

    var cell: CustomCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomCel  

      if cell == nil {
            tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: identifier)
           cell =tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomCell
        }return cell}
17
répondu ShigaSuresh 2015-04-13 04:42:23

j'ai le même problème.

en général, ce que j'ai fait est le même avec vous.

class dynamicCell: UITableViewCell {

    @IBOutlet var testLabel : UILabel

    init(style: UITableViewCellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

et dans la méthode uitable viewcell:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    var cell :dynamicCell = tableView.dequeueReusableCellWithIdentifier("cell") as dynamicCell

    cell.testLabel.text = "so sad"

    println(cell.testLabel)

    return cell;
}

et oui la vue sur la table ne montre rien! Mais devinez ce qu'il fait de montrer quelque chose...parce que le journal que j'obtiens de la cellule println (.testLabel) montre que toutes les Étiquettes sont affichées.

mais! leurs cadres sont étranges, ils ont quelque chose comme ceci:

frame = (0 -21; 42 21);

donc il a un (0,-21) comme (x,y), ce qui signifie que l'étiquette est juste apparaître quelque part à l'extérieur de la limite de la cellule.

donc j'essaie d'ajouter ajustez l'image manuellement comme ceci:

de la cellule.testLabel.frame = CGRectMake(10, 10, 42, 21)

et malheureusement, ça ne marche pas.

---------------mise à jour au bout de 10 min -----------------

JE L'AI FAIT. donc, il semble que le problème vient des classes de taille.

cliquez sur votre .fichier storyboard et passer à L'onglet "Inspecteur des fichiers

décocher la case

"

et enfin mon Label"so sad" sort!

13
répondu The Little DD 2014-06-17 16:49:28

Merci pour toutes les suggestions, mais j'ai enfin compris. La classe custom a été configurée correctement. Tout ce que je devais faire, était dans le storyboard où je choisis la classe custom: remove it, and select it again. Ça n'a pas beaucoup de sens, mais ça a fini par marcher pour moi.

11
répondu Nilzone- 2014-06-23 19:53:24

dernière mise à jour est avec Xcode 6.1

class StampInfoTableViewCell: UITableViewCell{


@IBOutlet weak var stampDate: UILabel!
@IBOutlet weak var numberText: UILabel!


override init?(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init(coder aDecoder: NSCoder) {
    //fatalError("init(coder:) has not been implemented")
    super.init(coder: aDecoder)
}

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
}
}
6
répondu ErcanE 2014-10-08 18:09:22

décocher "classes de taille" case à cocher fonctionne pour moi aussi, mais vous pouvez également ajouter les contraintes manquantes dans l'Interface builder. Suffit d'utiliser la fonction intégrée si vous ne voulez pas ajouter des contraintes sur votre propre. L'utilisation de contraintes est - à mon avis - la meilleure façon parce que la mise en page est indépendante de l'appareil (iPhone ou iPad).

1
répondu empty2308 2014-06-23 18:51:55

il est purement notation rapide un travail pour moi

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        var cellIdentifier:String = "CustomFields"
        var cell:CustomCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CustomCell
        if (cell == nil)
        {
            var nib:Array = NSBundle.mainBundle().loadNibNamed("CustomCell", owner: self, options: nil)
            cell = nib[0] as? CustomCell
        }
        return cell!
    }
1
répondu Gaurav 2015-02-09 22:12:25

[1] concevez D'abord votre cellule tableview dans un scénario-Maquette.

[2] Mis en dessous de la vue de la table délégué de la méthode

/ / marque: - Tableview Delegate Methods

func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{

    return <“Your Array”>
}


func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{

    var totalHeight : CGFloat = <cell name>.<label name>.frame.origin.y    

    totalHeight +=   UpdateRowHeight(<cell name>.<label name>, textToAdd: <your array>[indexPath.row])    

    return totalHeight
}


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


    var cell : <cell name>! = tableView.dequeueReusableCellWithIdentifier(“<cell identifire>”, forIndexPath: indexPath) as! CCell_VideoCall

    if(cell == nil)
    {
        cell = NSBundle.mainBundle().loadNibNamed("<cell identifire>", owner: self, options: nil)[0] as! <cell name>;
    }


    <cell name>.<label name>.text = <your array>[indexPath.row] as? String



    return cell as <cell name>
}

/ / marque: - Custom Methods

func UpdateRowHeight ( ViewToAdd : UILabel , textToAdd : AnyObject  ) -> CGFloat{


    var actualHeight : CGFloat = ViewToAdd.frame.size.height

    if let strName : String? = (textToAdd as? String)
        where !strName!.isEmpty
    {

        actualHeight = heightForView1(strName!, font: ViewToAdd.font, width: ViewToAdd.frame.size.width, DesignTimeHeight: actualHeight )

    }
    return actualHeight
}
1
répondu PSS 2016-04-20 08:41:49

Jeu de tag pour imageview et de l'étiquette dans la cellule

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

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

    let cell = tableView.dequeueReusableCellWithIdentifier("imagedataCell", forIndexPath: indexPath) as! UITableViewCell

    let rowData = self.tableData[indexPath.row] as! NSDictionary

    let urlString = rowData["artworkUrl60"] as? String
    // Create an NSURL instance from the String URL we get from the API
    let imgURL = NSURL(string: urlString!)
    // Get the formatted price string for display in the subtitle
    let formattedPrice = rowData["formattedPrice"] as? String
    // Download an NSData representation of the image at the URL
    let imgData = NSData(contentsOfURL: imgURL!)


    (cell.contentView.viewWithTag(1) as! UIImageView).image = UIImage(data: imgData!)

    (cell.contentView.viewWithTag(2) as! UILabel).text = rowData["trackName"] as? String

    return cell
}

ou

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "imagedataCell")

    if let rowData: NSDictionary = self.tableData[indexPath.row] as? NSDictionary,
        urlString = rowData["artworkUrl60"] as? String,
        imgURL = NSURL(string: urlString),
        formattedPrice = rowData["formattedPrice"] as? String,
        imgData = NSData(contentsOfURL: imgURL),
        trackName = rowData["trackName"] as? String {
            cell.detailTextLabel?.text = formattedPrice
            cell.imageView?.image = UIImage(data: imgData)
            cell.textLabel?.text = trackName
    }

    return cell
}

voir aussi Chargeur De Table de github "1519100920

0
répondu Jaleel Nazir 2015-05-27 10:17:42

la documentation de référence actuelle D'Apple est très complète

https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson7.html

Faites défiler vers le bas jusqu'à ce que vous voyiez cette partie

enter image description here

0
répondu Ives.me 2016-07-20 01:02:44