Лучший способ установить ячейку - PullRequest
0 голосов
/ 09 января 2020

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

В viewcontroller:

 let quantity = quantityProducts[indexPath.row]
 let nameProduct = productsArray[indexPath.row]
 cell.configurateWithItem(quantity: quantity, name: nameProduct)

В cellClass:

class NeedProductsTableViewCell: UITableViewCell {

@IBOutlet weak var quantityLabel: UILabel!
@IBOutlet weak var productNameLabel: UILabel!

func configurateWithItem(quantity:String,name:String){
    quantityLabel.text = quantity
    quantityLabel.textColor = .systemGray
    quantityLabel.font = quantityLabel.font.withSize(14)
    productNameLabel.text = name
    productNameLabel.font = UIFont.boldSystemFont(ofSize: 14)
}

или, может быть, стандартная версия (установить свойства ячейки в контроллере представления)?

  let cell = tableView.dequeueReusableCell(withIdentifier: "NeedProductsTableViewCell", for: indexPath) as! NeedProductsTableViewCell
        cell.quantityLabel.text = quantityProducts[indexPath.row]
        cell.quantityLabel.textColor = .systemGray
        cell.quantityLabel.font = cell.quantityLabel.font.withSize(14)
        cell.productNameLabel.text = productsArray[indexPath.row]
        cell.productNameLabel.font = UIFont.boldSystemFont(ofSize: 14)

Ответы [ 2 ]

3 голосов
/ 09 января 2020

Ответ может быть основан на мнении, но я действительно не вижу никаких аргументов в пользу использования второго подхода «стандартной версии».

Это выходит за рамки MVC, но вы должны держать свой интерфейс publi c закрытым насколько возможно, выставляйте только те свойства, которые имеют смысл. Поэтому используйте private в большинстве случаев.

Поэтому в вашей ячейке я предлагаю

@IBOutlet private var quantityLabel: UILabel!
@IBOutlet private var productNameLabel: UILabel!

Вы можете сохранять weak, хотя это и не нужно. Вы также можете использовать дополнительные параметры вместо принудительно развернутых значений quantityLabel: UILabel? вместо quantityLabel: UILabel! для улучшения стабильности.

Так что, как только у вас есть внутренние детали, вам нужно проверить, как открыть ваш интерфейс. У этого все еще есть многократные образцы; один из них - то, что вы использовали, ваша ячейка не сохраняет объект, который вы вводите, а просто изменяет его визуальное представление. Другой будет выглядеть так:

class NeedProductsTableViewCell: UITableViewCell {

@IBOutlet private var quantityLabel: UILabel?
@IBOutlet private var productNameLabel: UILabel?

var item: (quantity: String, name: String)? {
    didSet {
        if let item = item {
            quantityLabel?.text = item.quantity
            quantityLabel?.textColor = .systemGray
            quantityLabel?.font = quantityLabel.font.withSize(14)
            productNameLabel?.text = item.name
            productNameLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        }        
    }
}

В этом случае вы будете использовать в своем источнике данных:

cell.item = (quantityProducts[indexPath.row], productsArray[indexPath.row])

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

private var items: [(quantity: String, name: String)] = []

вместо

private var quantityProducts: [String] = []
private var productsArray: [String] = []    
0 голосов
/ 09 января 2020

Если вы хотите использовать принцип Единая ответственность , лучшее, что вы можете сделать, это не иметь delegate из UITableView для вашего UIViewController и иметь новый класс под названием YourTableViewController : UITableViewController и назначьте этот класс вашему tableView в раскадровке.

Теперь ваш UIViewController обрабатывает проблемы UIViewController, класс UITableView обрабатывает проблемы UITableView, а все, что связано с UITableViewCell, обрабатывается классом CustomUITableViewCell.

Поэтому лучше всего вызывать функцию configurateWithItem() после создания ячейки, но из пользовательского класса UITableView.

Следуя этому правилу, вы сохраняете свой UIViewControllers небольшим и не создавать контроллеры Massive View . Также UITableViewControllers можно повторно использовать в различных UIViewControllers.

...