>source

테이블 뷰의 각 사용자 정의 셀은 API에서 반환되는 데이터 수에 따라 하나 또는 둘 이상의 레이블을 가질 수 있습니다.

cellForRowAtIndexPath 메소드에서 셀에 동적 수의 레이블을 작성하려고했습니다. 그러나 스크롤 할 때마다이 모든 레이블이 서로 겹칩니다. 셀에 동적 수의 레이블을 만드는 다른 방법이 있습니까?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PracLabelCell", for: indexPath) as! PracLabelCell
    let w : CGFloat = CGFloat(self.tableview.frame.size.width/3)
    var x : CGFloat = 0
    for index in 0...2
    {
        let label = UILabel(frame: CGRect(x: x, y: cell.frame.origin.y, width: w , height: cell.frame.size.height))
        let str = String(index)
        print(str)
        label.text = str
        cell.contentView.addSubview(label)
        print("x is" , x)
        x += w
    }
    return cell
}

  • 답변 # 1

    와이즈 비즈

  • 답변 # 2

    셀에있는 경우

    you need to create inner tableview inside cell its more better than loop and create label manually. you just need to create tableview inside your main cell. for inner tableview create cell with label thats it now you can return number of cells as you want. hope this helps you.

    에 레이블을 추가하지 않은 경우  파일. 그런 다음 시도하십시오

    .xib
    
    

  • 답변 # 3

    UIStackview를 사용하면됩니다. 다음은 각 행에 1, 2 또는 3 레이블을 표시 할 수있는 테이블 뷰가있는 뷰 컨트롤러의 샘플 코드입니다. cellForRow 데이터 소스 메소드에는 요구 사항에 따라 lables 수를 전환하는 로직이 있습니다.

    let cell = tableView.dequeueReusableCell(withIdentifier: "PracLabelCell", for: indexPath) as! PracLabelCell
    let w : CGFloat = CGFloat(self.tableview.frame.size.width/3)
    var x : CGFloat = 0
    for subView in cell.contentView.subviews{
         if subView.isKind(of: UILabel.self){
             return cell
         }
    }
    
    

    LabelTableViewCell 클래스는 UITableViewCell의 서브 클래스이며 UIStackView를 포함합니다. 스택보기는 레이블을 세로로 배열하는 작업을 처리합니다. 또한 인터페이스 빌더에서 스택보기의 정렬 된 하위보기로 추가 된 하나 이상의 레이블이 숨겨지면 스택보기의 높이가 조정됩니다. 트릭은 스택 뷰의 상단에서 셀의 내용보기의 상단 및 유사한 하단 제약 조건 사이에 제약 조건이 있습니다. 이렇게하면 스택 뷰의 높이가 변경되면 셀의 높이도 그에 따라 변경됩니다.

    더 나은 이해를 위해 프로젝트를 GitHub에 추가했습니다

    결과의 스크린 샷입니다.

  • 답변 # 4

    제약을 사용하여 셀 높이를 증가시킵니다 . 셀에 세로 스택 뷰를 추가하십시오. 또한 셀 클래스에서 인수 값을 기반으로 레이블을 추가하는 함수를 만듭니다.

    import UIKit
    class ViewController: UIViewController {
        // This array contains the sample data to populate the tableview. Each 
           element dictates the number of labels to be shown in the cell
        var tableData = [1,2,3,2,3,2]
    }
    extension ViewController: UITableViewDataSource, UITableViewDelegate {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: 
    Int) -> Int {
            return tableData.count
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: 
    IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "LabelRow", 
    for: indexPath) as! LabelTableViewCell
            let labelCount = tableData[indexPath.row]
            // Check the label count for the current row to decide how many labels to show.
            // Extra lables are hidden
            switch labelCount {
            case 1:
                cell.label1.isHidden = false
                cell.label2.isHidden = true
                cell.label3.isHidden = true
            case 2:
                cell.label1.isHidden = false
                cell.label2.isHidden = false
                cell.label3.isHidden = true
            default:
                cell.label1.isHidden = false
                cell.label2.isHidden = false
                cell.label3.isHidden = false
            }
            return cell
        }
    }
    
    

    class PracLabelCell: UITableViewCell { let titleLabel = UILabel() let stackView = UIStackView() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() } func commonInit() { titleLabel.translatesAutoresizingMaskIntoConstraints = false addSubview(titleLabel) stackView.axis = .vertical stackView.distribution = .fillEqually stackView.alignment = .fill stackView.spacing = 2 stackView.translatesAutoresizingMaskIntoConstraints = false addSubview(stackView) titleLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true titleLabel.heightAnchor.constraint(equalToConstant: 30).isActive = true stackView.topAnchor.constraint(equalTo: titleLabel.bottomAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true stackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true stackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true } func setup(names: [String]) { stackView.arrangedSubviews.forEach { stackView.removeArrangedSubview($0);$0.removeFromSuperview() } names.forEach { let label = UILabel() label.text = $0 stackView.addArrangedSubview(label) } } } 의 값을 전달하십시오.  방법.

    tableView cellForRowAt
    
    

    class TableViewController: UITableViewController { var namesArray = [["a","b","c"],["d","e"],["f"],["g","h"],[],["j"]] override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white tableView.register(PracLabelCell.self, forCellReuseIdentifier: "PracLabelCell") } // MARK: - Table view data source override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return namesArray.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "PracLabelCell", for: indexPath) as! PracLabelCell cell.titleLabel.text = "This cell has \(namesArray[indexPath.row].count) labels" cell.setup(names: namesArray[indexPath.row]) return cell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } }

관련 자료

  • 이전 pandas - 두 파일을 반복적으로 비교하고 부모 자식 관계를 구축하는 Python 논리
  • 다음 도커 컨테이너로 plex를 실행하면 웹 UI에 액세스 할 수 없습니다