2015-03-08 2 views
0

Вот интересная проблема, которую я пытаюсь решить.Восстановить UITableViewCell из раскадровки для каждой строки без удаления

Я хочу использовать одну ячейку, которая настроена в раскадровке для разных конфигураций ячеек, удаляя ненужные вещи из ячейки.

Вот как спрятать ячейку. Storyboard cell

В принципе, если я не нужен образ для шага (или красный зрения) я просто удалить его из клетки, и все совпадет динамически просто отлично, и я не рассчитать высоту ячейки или делать какие-либо кодирование. Однако, поскольку я должен повторно использовать ячейки, когда я получаю ячейку для следующей строки, у меня нет этого представления. Я могу добавить его снова в ячейку, но я теряю все ограничения.

В случае, если вам это нужно для идей, вот некоторый код:

class RecipeStepTableViewCell: UITableViewCell { 

    @IBOutlet weak var preparationLabel: UILabel! 
    @IBOutlet weak var stepNumberLabel: UILabel! 
    @IBOutlet weak var stepImageView: UIImageView! 
    @IBOutlet weak var stepTextLabel: UILabel! 
    @IBOutlet weak var stepTimerView: UIView! 

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

И это, как я справиться с этим он cellForRowAtIndexPath:

let cell = tableView.dequeueReusableCellWithIdentifier("RecipeStepCell", forIndexPath: indexPath) as RecipeStepTableViewCell 
let step = stepForIndexPath(indexPath) 

if step.image == nil { 
    cell.stepImageView.removeFromSuperview() 
} 
// etc. 

Мне очень нравится этот подход, поскольку у меня нет для создания 10 конфигураций ячеек, и все, что мне нужно, это заставить его создать новую ячейку для каждой строки.

Кстати, у представления будет только 5, 6 ячеек, поэтому производительность не должна быть проблемой.

ответ

0

Кажется, что удаление изображения удаляет все связанные с ним ограничения.

У меня есть идея. Вместо удаления изображения вы можете просто настроить ограничения, когда step.image == nil, так как изображение будет невидимым в любом случае.

Это можно сделать, используя раскадровку для подключения IBOutlets к ограничениям. Это будет выглядеть следующим образом:

@IBOutlet weak var constraintToTop: NSLayoutConstraint! 

А потом, чтобы настроить его,

let cell = tableView.dequeueReusableCellWithIdentifier("RecipeStepCell", forIndexPath: indexPath) as RecipeStepTableViewCell 
let step = stepForIndexPath(indexPath) 

if step.image == nil { //Set constraint(s) so imageView takes up no space 
    cell.constraintToTop.constant = 0 
} 
else { //Go back to original constraints 
    cell.constraintToTop.constant = 50 
} 

Это может потребовать создания многих IBOutlets для ограничений, чтобы получить желаемый результат, но это общая идея.

Надеюсь, это вам поможет.

+0

Это работает просто отлично. Единственная проблема заключается в том, что я также должен сохранять ограничения на интервал и устанавливать их на ноль, но он работает с идентификатором повторного использования, например, с таблицами. Благодаря! –