J'ai essayé de trouver de la documentation/tutoriel/exemples. Comment faire une vue de table avancée dans Swift. Mais je suis venu vide en plus des didacticiels de storyboard sans fin.
Je fais ça sans storyboards et plumes. Et je n'ai pas pu trouver de documentation au-delà de la bibliothèque/mal/expliquée d'Apple.
Plutôt que d'essayer d'expliquer exactement ce que je recherche, je vais simplement montrer une image du design ci-dessous.
Pour le moment, je ne vous demande évidemment pas de créer ceci pour moi. J'espère simplement que vous pourrez m'envoyer un lien vers une documentation/un tutoriel. Cela explique comment rendre les cellules différentes? et comment vous positionnez des éléments dans une cellule par programme.
J'ai cherché des contraintes de cellule, mais je n'en trouve pas?
J'ai également examiné des cellules prototypes, mais tout ce que j'ai pu trouver était lié au storyboard.
J'espère que vous pourriez me montrer un exemple de quelque chose de similaire, de la documentation/du tutoriel.
Une autre chose importante. Toute documentation que j'ai trouvée n'utilisait pas de story-boards. Tous utilisaient un tableViewController.
J'utilise un UIViewController, avec un UITableView. Pas un tableViewController, ce qui semble faire une énorme différence sur son fonctionnement.
Pour l'instant, j'essaie simplement de faire fonctionner un prototype.
voici mes données ci-dessous:
var objects = NSMutableArray()
var dataArray = [ ["stockName":"CTC Media Inc.","action":"sell","stockPrice":12.44],
["stockName":"Transglobal Energy","action":"buy","stockPrice":39.40],
["stockName":"NU Skin Enterprises","action":"buy","stockPrice":4.18]
]
Je n'ai cependant pu en extraire et afficher qu'une seule donnée.
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//return self.stocks.count
return dataArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
let object = dataArray[indexPath.row] as NSDictionary
cell.textLabel?.text = object["stockName"] as? String
return cell
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println("You selected cell #\(indexPath.row)!")
}
Mais je ne sais toujours pas comment je positionne ces données, ou en ajoute plus. Tels que l'UIView à droite avec une couleur d'arrière-plan spécifique. Centrage d'un UILabel dans cet UIView, ajout d'un UIView sur la gauche avec un rembourrage, un espacement personnalisé entre les cellules. Etc.
Toute aide, liens vers la documentation, suggestions seraient grandement appréciées!
MODIFIER:
J'ai essayé d'ajouter des contraintes à l'intérieur de la cellule avec. "cell.view.addConstraints ("
Mais bien sûr, il génère une erreur indiquant "UITableViewCell n'a pas de membre nommé view".
Donc, pour savoir comment faire des contraintes à l'intérieur des cellules, je suis toujours vide :(
EDIT 2 - progrès:
J'ai réussi à faire apparaître une UIView à l'aide du code suivant:
testView.setTranslatesAutoresizingMaskIntoConstraints(false)
testView.backgroundColor = UIColor.redColor()
cell.addSubview(testView)
var viewsDictionary = [ "testView":testView]
cell.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-50-[testView]|", options: nil, metrics: nil, views: viewsDictionary))
cell.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"V:|[testView]|", options: nil, metrics: nil, views: viewsDictionary))
Cependant, pour une raison quelconque, il n'apparaît que dans la dernière cellule, pas toutes les cellules?
J'ai juste joué un peu. Même si toutes les couleurs/polices ne sont pas tout à fait correctes, cela vous donnera un bon point de départ. J'espère que cela vous aide.
class Stock {
var name: String?
var action: String?
var price: String?
init(stockData: [String: AnyObject]) {
if let n = stockData["stockName"] as? String {
name = n
}
if let a = stockData["action"] as? String {
action = a
}
if let p = stockData["stockPrice"] as? Float {
price = NSString(format: "%.2f", p)
}
}
var backgroundColor: UIColor {
if action == "sell" {
return UIColor.greenColor()
}
return UIColor.blueColor()
}
var typeColor: UIColor {
if action == "sell" {
return UIColor.blackColor()
}
return UIColor.purpleColor()
}
var priceLabelColor: UIColor {
if action == "sell" {
return UIColor.redColor()
}
return UIColor.greenColor()
}
}
class StockCell: UITableViewCell {
let padding: CGFloat = 5
var background: UIView!
var typeLabel: UILabel!
var nameLabel: UILabel!
var priceLabel: UILabel!
var stock: Stock? {
didSet {
if let s = stock {
background.backgroundColor = s.backgroundColor
priceLabel.text = s.price
priceLabel.backgroundColor = s.priceLabelColor
typeLabel.text = s.action
typeLabel.backgroundColor = s.typeColor
nameLabel.text = s.name
setNeedsLayout()
}
}
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
backgroundColor = UIColor.clearColor()
selectionStyle = .None
background = UIView(frame: CGRectZero)
background.alpha = 0.6
contentView.addSubview(background)
nameLabel = UILabel(frame: CGRectZero)
nameLabel.textAlignment = .Left
nameLabel.textColor = UIColor.blackColor()
contentView.addSubview(nameLabel)
typeLabel = UILabel(frame: CGRectZero)
typeLabel.textAlignment = .Center
typeLabel.textColor = UIColor.whiteColor()
contentView.addSubview(typeLabel)
priceLabel = UILabel(frame: CGRectZero)
priceLabel.textAlignment = .Center
priceLabel.textColor = UIColor.whiteColor()
contentView.addSubview(priceLabel)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func prepareForReuse() {
super.prepareForReuse()
}
override func layoutSubviews() {
super.layoutSubviews()
background.frame = CGRectMake(0, padding, frame.width, frame.height - 2 * padding)
typeLabel.frame = CGRectMake(padding, (frame.height - 25)/2, 40, 25)
priceLabel.frame = CGRectMake(frame.width - 100, padding, 100, frame.height - 2 * padding)
nameLabel.frame = CGRectMake(CGRectGetMaxX(typeLabel.frame) + 10, 0, frame.width - priceLabel.frame.width - (CGRectGetMaxX(typeLabel.frame) + 10), frame.height)
}
}
dans votre contrôleur de vue
var stocks: [Stock] = []
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.whiteColor()
for stockData in dataArray {
var stock = Stock(stockData: stockData)
stocks.append(stock)
}
tableView = UITableView(frame: view.bounds, style: .Grouped)
tableView.delegate = self
tableView.dataSource = self
tableView.separatorStyle = .None
tableView.registerClass(StockCell.self, forCellReuseIdentifier: NSStringFromClass(StockCell))
view.addSubview(tableView)
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return stocks.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier( NSStringFromClass(StockCell), forIndexPath: indexPath) as StockCell
cell.stock = stocks[indexPath.row]
return cell
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 70
}
Cellule personnalisée
class StockCell: UITableViewCell {
let padding: CGFloat = 5
var background: UIView!
var typeLabel: UILabel!
var nameLabel: UILabel!
var priceLabel: UILabel!
var stock: Stock? {
didSet {
if let s = stock {
background.backgroundColor = s.backgroundColor
priceLabel.text = s.price
priceLabel.backgroundColor = s.priceLabelColor
typeLabel.text = s.action
typeLabel.backgroundColor = s.typeColor
nameLabel.text = s.name
setNeedsLayout()
}
}
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
backgroundColor = UIColor.clearColor()
selectionStyle = .None
background = UIView(frame: CGRectZero)
background.alpha = 0.6
contentView.addSubview(background)
nameLabel = UILabel(frame: CGRectZero)
nameLabel.textAlignment = .Left
nameLabel.textColor = UIColor.blackColor()
contentView.addSubview(nameLabel)
typeLabel = UILabel(frame: CGRectZero)
typeLabel.textAlignment = .Center
typeLabel.textColor = UIColor.whiteColor()
contentView.addSubview(typeLabel)
priceLabel = UILabel(frame: CGRectZero)
priceLabel.textAlignment = .Center
priceLabel.textColor = UIColor.whiteColor()
contentView.addSubview(priceLabel)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func prepareForReuse() {
super.prepareForReuse()
}
override func layoutSubviews() {
super.layoutSubviews()
background.frame = CGRectMake(0, padding, frame.width, frame.height - 2 * padding)
typeLabel.frame = CGRectMake(padding, (frame.height - 25)/2, 40, 25)
priceLabel.frame = CGRectMake(frame.width - 100, padding, 100, frame.height - 2 * padding)
nameLabel.frame = CGRectMake(CGRectGetMaxX(typeLabel.frame) + 10, 0, frame.width - priceLabel.frame.width - (CGRectGetMaxX(typeLabel.frame) + 10), frame.height)
}
}