Как уменьшить размер дефолтного ImageView в TableViewCell?

customtableviewcell
swift
tableview

#1

при использовании стандартного Image View в TableViewCell не получается изменить размер картинки. В сториборде этот Image View не виден, пытался достать обычным кодом.

cell?.imageView?.layer.frame.size.height = 50
cell?.imageView?.clipsToBounds = true

Но ничего не реагирует. Похоже, что этот дефолтный ImageView прописан в ячейке каким-то специальным образом, но как именно? Гугл пока не помогает. Понимаю, что можно сделать custom cell, но не хотелось бы из-за одной фичи делать отдельный класс.


#2

Лучше кастомный класс, меньше проблем будет, да и не так долго он делается.


#3

Вы правы, тоже к этому пришел после нескольких часов проб и ошибок.

Но там возникают другие сложности, может быть подскажете в каком направлении стоит подумать. Нужно вставить кнопку в ячейку. Как оказалось это не тривиальная задача. Посмотрел несколько тьюториалов, там все как-то сложно и не очень стабильно. Может быть есть какие-то наработки из опыта или проверенный тюториал?

Accessories использовать не могу, потому как оно зарезервировано для перехода на Detail экран.


#4

А конкретнее, какие трудности с кнопкой?


#5

как передать indexPath в кнопку, которая находится в custom классе?


#6

можно не передавать.
при нажатии на кнопку возвращать self от ячейки. в самом VC полученный self от ячейки использовать в методе tableView indexPath(for:Cell), который и вернет вам indexPath ячейки.


#7

а как передать этот self? можно какой-нибудь фрагмент кода для образца?


#8
protocol MyCellDelegate: class {
    func didTapButton(_ cell: MyCell)
}

class MyCell: UITableViewCell {
    weak var delegate: MyCellDelegate?

    @IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(self)
    }
}

#9

Спасибо! Пойду пробовать.


#10

увы, не сдюжил ваш код, не понимаю как он работает. Позвольте вас немного поспрашивать на эту тему. Предположим в проекте есть NewTVC и NewCustomCell классы. Отсюда, пример вашего кода получается следующим образом:

protocol NewCustomCellDelegate: NewTVC {
        func didTapButton(_ cell: NewCustomCell)
    }

class NewCustomCell: UITableViewCell {
    weak var delegate: NewCustomCellDelegate?

    @IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(self)
    }
}

Это всё в файле NewCustomCell класса.

Вопросы:

  1. Где записать само действие по нажатию кнопки? Например, просто print() для проверки. Там где функция объявляется, т.е. в NewCusromCell или в NewTVC?

  2. Где вызвать этот метод нажатия кнопки? Выше вы написали, что в методе tableView indexPath(for:Cell). Но ведь там этот метод будет применяться ко всем ячейкам, а нужно только к одной, т.е. в момент нажатия на кнопку в определенной строке. didSelectRowAt тоже не подходит, потому как нажатие идет на всю строку.

  3. Как передать параметры в этот метод при вызове и использовать self?


#11

Вопросы (Ответы):

  1. Где записать само действие по нажатию кнопки? Например, просто print() для проверки. Там где функция объявляется, т.е. в NewCusromCell или в NewTVC?

Свой ViewController который содержит таблицу отображающую эту ячейку, подписываешь под протокол:

protocol MyCellDelegate: class {
func didTapButton(_ cell: MyCell)
}

и реализуешь метод:

didTapButton(_ cell: MyCell) {
// здесь твой print(“Проверка”)
}

  1. Где вызвать этот метод нажатия кнопки? Выше вы написали, что в методе tableView indexPath(for:Cell). Но ведь там этот метод будет применяться ко всем ячейкам, а нужно только к одной, т.е. в момент нажатия на кнопку в определенной строке. didSelectRowAt тоже не подходит, потому как нажатие идет на всю строку.

в методе

tableView indexPath(for:Cell)

ты присваиваешь:

cell.delegate = self

  1. Как передать параметры в этот метод при вызове и использовать self?

Если хочешь передать параметры то расширь метод в протоколе:

protocol MyCellDelegate: class {
func didTapButton(_ cell: MyCell, myParameter1: String, myParameter2: Int)
}


#12

Спасибо, что помогаешь! Подскажи, пожалуйста, вот в этом блоке кода так и писать в первой строке слово “class” или вместо него надо писать имя класса?


#13

так и писать ключевое слово class


#14

честно говоря, в голове полная каша(. В принципе код тут небольшой, подскажите, плиз, что надо изменить.

TVC

import UIKit   

protocol NewCustomCellDelegate: class {
    func didTapButton(_ cell: NewCustomCell)
}

class NewTVC: UITableViewController, NewCustomCellDelegate {
    
    func didTapButton(_ cell: NewCustomCell) {
        print("Hello!") // Работает.
        let indexPath = tableView.indexPathForSelectedRow!
        print(indexPath) // Выдает nil.
    }

    var items = [Item]()
    
    var itemsVC = ItermsViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        items = itemsVC.uploadData()
    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {     
        return items.count            
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {            
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? NewCustomCell 

        let item = items[indexPath.row]
        
        cell?.customItemIDLabel.text = item.itemID
        cell?.customCategoryLabel.text = item.category
        
        cell?.delegate = self
        
        didTapButton(sender: Any) // Что сюда передать в качестве sender?

        return cell!
    }
}

Custom Cell

import UIKit

class NewCustomCell: UITableViewCell {

    @IBOutlet weak var customItemIDLabel: UILabel!
    @IBOutlet weak var customCategoryLabel: UILabel!
    
    weak var delegate: NewCustomCellDelegate?

    @IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(self)
    }
}

Задача такая, что надо по нажатию кнопки, которая находится в ячейке таблицы, выполнять определенное действие. Для этого надо получить индекс ячейки и по нему вытащить значение (код действия) из массива. Частично операция уже работает, т.е. по нажатию кнопки печатается содержание принта, но не срабатывает получение индекса ячейки.


#15

Я бы сделала топорно, присвоив кнопке в каждой ячейке тэг по indexPAth.row, а в didTapButton(_ sender: Any) сделала бы didTapButton(_ sender: UIButton), и тогда можно будет использовать sender.tag, что и будет соответствовать indexPAth.row нужной ячейки))
Но интересно послушать мнение опытных ребят, так как тоже с таким сталкивалась


#16
if let indexPath = tableView.indexPath(for: cell) {
    print(indexPath)
}

#17

а в каком методе это вызвать и что такое в данном случае cell?


#18
func didTapButton(_ cell: NewCustomCell) {
    print("Hello!") // Работает.
    if let indexPath = tableView.indexPath(for: cell) {
        print(indexPath)
    }
}

#19

Спасибо огромное, всё работает!


#20

Единственное, что не совсем понятно, как именно оно работает. Если я еще немного поспрашиваю это нормально будет?