gpt4 book ai didi

ios - 如何让我的单元格自动调整大小?

转载 作者:搜寻专家 更新时间:2023-11-01 07:05:27 24 4
gpt4 key购买 nike

虽然我到处都找过了,但我仍然无法找到解决这个问题的方法。我正在 Xcode 中创建一个待办事项应用程序,当我将标签文本编辑得更长(多行)时,我无法让我的单元格自动调整大小。这是我到目前为止所做的:

  • 将标签的设置为0
  • 将标签的Line Break设置为Word Wrap
  • Added these constraints to the label inside of the cell
  • HomeTableViewController.swift 中添加了以下代码:

    override func viewWillAppear(_ animated: Bool) {
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 85.0
    }

Still, I'm having this problem... (notice line 1)

这变得非常令人沮丧,如果有人能帮助我,我将不胜感激!

整个HomeViewController.swift代码:

//
// HomeTableViewController.swift
// Do
//
// Created by Justin Owens on 12/16/17.
// Copyright © 2017 Justin Owens. All rights reserved.
//

import UIKit

class HomeTableViewController: UITableViewController, AddItemTableViewControllerDelegate {

// MARK:

func addItemTableViewControllerCanceled(_ controller: AddItemTableViewController) {
navigationController?.popViewController(animated: true)
}

func addItemTableViewController(_ controller: AddItemTableViewController, didFinishEditing item: DoItem) {
if let index = items.index(of: item)
{
let indexPath = IndexPath(row: index, section: 0)

if let cell = tableView.cellForRow(at: indexPath)
{
configureLabels(for: cell, with: item)
}
}

navigationController?.popViewController(animated: true)
}

func addItemTableViewController(_ controller: AddItemTableViewController, didFinishAdding item: DoItem) {
let newRowIndex = items.count
let indexPath = IndexPath(row: newRowIndex, section: 0)
let indexPaths = [indexPath]

items.append(item)
tableView.insertRows(at: indexPaths, with: .automatic)

navigationController?.popViewController(animated: true)
}

// MARK:

var groups = [""]

// MARK:

var items: [DoItem]

required init?(coder aDecoder: NSCoder)
{
items = [DoItem]()

let row0Item = DoItem()
row0Item.text = "NSA interview"
row0Item.checked = false
items.append(row0Item)

let row1Item = DoItem()
row1Item.text = "Work on app"
row1Item.checked = false
items.append(row1Item)

let row2Item = DoItem()
row2Item.text = "Do homework"
row2Item.checked = false
items.append(row2Item)

let row3Item = DoItem()
row3Item.text = "Catch up on Shameless"
row3Item.checked = false
items.append(row3Item)

super.init(coder: aDecoder)
}

// MARK:

override func viewDidLoad()
{
super.viewDidLoad()

navigationController?.navigationBar.prefersLargeTitles = true
}

override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 85.0
}

// MARK:

override func numberOfSections(in tableView: UITableView) -> Int {
return groups.count
}

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: "DoItemIdentifier", for: indexPath)
let item = items[indexPath.row]

configureLabels(for: cell, with: item)
configureCheckmark(for: cell, with: item)

return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
if let cell = tableView.cellForRow(at: indexPath)
{
let item = items[indexPath.row]

item.toggleCheck()
configureCheckmark(for: cell, with: item)
}

tableView.deselectRow(at: indexPath, animated: true)
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
let indexPaths = [indexPath]

items.remove(at: indexPath.row)
tableView.deleteRows(at: indexPaths, with: .automatic)
}

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Section \(section)"
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "AddItem"
{
let controller = segue.destination as! AddItemTableViewController
controller.delegate = self
}
else if segue.identifier == "EditItem"
{
let controller = segue.destination as! AddItemTableViewController
controller.delegate = self

if let indexPath = tableView.indexPath(for: sender as! UITableViewCell)
{
controller.itemToEdit = items[indexPath.row]
}
}
}

// MARK:

func configureLabels(for cell: UITableViewCell, with item: DoItem)
{
let mainLabel = cell.viewWithTag(1000) as! UILabel

mainLabel.text = item.text
}

func configureCheckmark(for cell: UITableViewCell, with item: DoItem)
{
let checkmark = cell.viewWithTag(1001)

if item.checked
{
checkmark?.isHidden = false
}
else
{
checkmark?.isHidden = true
}
}

// MARK:

@IBAction func addButtonAction(_ sender: Any)
{
let newRowIndex = items.count
let item = DoItem()
let indexPath = IndexPath(row: newRowIndex, section: 0)
let indexPaths = [indexPath]

item.text = ""
item.checked = false

items.append(item)
tableView.insertRows(at: indexPaths, with: .automatic)
}
}

附言每当用户在 AddItemViewController 屏幕上编辑标签后按下 Done 按钮时,我都尝试添加 tableView.reloadData();不用说,这并没有改变任何东西。

最佳答案

您错过了底部约束。单元格的 contentView 不知道如何拉伸(stretch),通过将标签的底部限制到单元格的底部,您告诉单元格根据标签大小自行调整大小。

参见 my other answer了解更多详情。

我可以在您的代码中看到一些其他难闻的气味。

首先,改变:

tableView.insertRows(at: indexPaths, with: .automatic)

到:

tableView.beginUpdates()
tableView.insertRows(at: indexPaths, with: .automatic)
tableView.endUpdates()

(同样适用于删除行)。

然后移动:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 85.0

viewDidLoad - 一开始配置一次就够了。

同时删除标签 width 约束 - 您已经将其设置为受限于前导和尾随 anchor (还要确保您没有设置高度约束)。

最后,使用 @IBOutlet 而不是使用标签来识别 Storyboard中创建的 View (我指的是您对单元格配置的处理)。

关于ios - 如何让我的单元格自动调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com