gpt4 book ai didi

swift - UITableview 将单元​​格移动到错误的部分,并用空白单元格替换其先前的位置

转载 作者:行者123 更新时间:2023-11-30 10:34:55 25 4
gpt4 key购买 nike

我有一个 UITableview,一旦检测到前面的单元格 TextView 中的某些内容,它就会动态地将 tableviewcells 添加到 tableview 中。为了使用户正在输入的 uitableviewcell 位于中心,我使用通知移动插图。

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)

@objc func keyboardWillShow(_ notification : Notification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
creationTableView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)
//creationTableView.scrollIndicatorInsets = creationTableView.contentInset
}
}

@objc func keyboardWillHide(_ notification : Notification) {
creationTableView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)
//creationTableView.scrollIndicatorInsets = creationTableView.contentInset
}

这里的问题是,当我将 uitableview 插图移得太远时,最上面的单元格向下移动到该部分,尽管我的代码不允许这种情况发生。视频中发生的情况的一个示例是,当显示“黄油”的单元格向下移动到我在视频末尾附近输入的位置时。

( https://imgur.com/a/bAlz7OY )

我需要解决的问题是如何阻止这种情况发生?

编辑:添加了用于创建单元格和实际 tableviewcell 类本身的代码。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = creationTableView.dequeueReusableCell(withIdentifier: "recipeInstructionsCell", for: indexPath) as! RecipeInstructionsCell
cell.selectionStyle = .none
cell.indexPath = indexPath
cell.tableViewMaster = self.creationTableView
//cell.cellTextView.tag = indexPath.row
cell.delegate = self


if indexPath.section == 0 && indexPath.row < temporaryRecipeItem.ingredients.count && !temporaryRecipeItem.ingredients.isEmpty {
cell.cellTextView.text = temporaryRecipeItem.ingredients[indexPath.row]
} else if indexPath.row < temporaryRecipeItem.instructions.count && !temporaryRecipeItem.instructions.isEmpty {
cell.cellTextView.text = temporaryRecipeItem.instructions[indexPath.row]
}

return cell
}


//Delegate Method
func editText(at indexPath: IndexPath) {
let cell = creationTableView.cellForRow(at: indexPath) as! RecipeInstructionsCell

//if the cell has more than one character in it
if cell.cellTextView.text.count == 1 {
if creationTableView.cellForRow(at: IndexPath(row: indexPath.row + 1, section: indexPath.section)) == nil {
self.addRow(at: indexPath)
}
} else {
let oneAheadIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)
let cellBelowCurrentCell = creationTableView.cellForRow(at: oneAheadIndexPath) as! RecipeInstructionsCell
//If the current cell the user is typing in has all of its characters removed and a cell is empty below the user delete the cell below
if cell.cellTextView.text.isEmpty && cellBelowCurrentCell.cellTextView.text.isEmpty {
//cell.hasAddedRow = false
self.deleteRow(at: indexPath)
}
}
//creationTableView.scrollToRow(at: cell.indexPath!, at: .top, animated: false)
}

//If instructions contain keywords like cook, caramalize, fry ,whisk ,frying pan, dice, cut, grill, roast ,and temperatures display an appropriate image to go allow with the instruction in the

func addRow(at indexPath : IndexPath) {
if indexPath.section == 0 {
numberOfIngredients += 1
} else {
numberOfInstructions += 1
}
print("Insert at section: \(indexPath.section) row: \(indexPath.row)")

//Insert another cell ahead of the one the user is currently typing in
let oneAheadIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)
creationTableView.beginUpdates()
creationTableView.insertRows(at: [oneAheadIndexPath], with: .right)
creationTableView.endUpdates()
}

func deleteRow(at indexPath : IndexPath) {
if indexPath.section == 0 {
numberOfIngredients -= 1
} else {
numberOfInstructions -= 1
}
//Delete another cell ahead of the one the user is currently in
let oneAheadIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)
creationTableView.beginUpdates()
creationTableView.deleteRows(at: [oneAheadIndexPath], with: .right)
creationTableView.endUpdates()
}

TableViewCell类

protocol RecipeInstructionsCellProtocol {
func editText(at indexPath : IndexPath)
}

类 RecipeInstructionsCell:UITableViewCell、UITextViewDelegate {

@IBOutlet var cellTextView: UITextView!
var indexPath : IndexPath?
var tableViewMaster : UITableView?
var delegate : RecipeInstructionsCellProtocol?


override func awakeFromNib() {
super.awakeFromNib()
self.cellTextView.delegate = self
self.cellTextView.tintColor = UIColor.blue
self.cellTextView.autocorrectionType = .yes
self.cellTextView.autocapitalizationType = .sentences
//self.cellTextView.textColor = UIColor.lightGray
self.cellTextView.isScrollEnabled = false
self.cellTextView.textContainer.heightTracksTextView = true
self.cellTextView.returnKeyType = .next
}



func textViewDidChange(_ textView: UITextView) {
let size = textView.bounds.size
let newSize = textView.sizeThatFits(CGSize(width: size.width, height: CGFloat.greatestFiniteMagnitude))

if size.height != newSize.height {
self.tableViewMaster?.beginUpdates()
self.tableViewMaster?.endUpdates()

//let thisIndexPath = IndexPath(row: textView.tag, section: 0)
}
delegate?.editText(at: (self.indexPath!))
}

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
if tableViewMaster!.cellForRow(at: IndexPath(row: self.indexPath!.row + 1, section: self.indexPath!.section)) != nil {
self.cellTextView.resignFirstResponder()
let cell = tableViewMaster?.cellForRow(at: IndexPath(row: self.indexPath!.row + 1, section: self.indexPath!.section)) as! RecipeInstructionsCell
cell.cellTextView.becomeFirstResponder()
}
}
return true
}

}

最佳答案

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = creationTableView.dequeueReusableCell(withIdentifier: "recipeInstructionsCell", for: indexPath) as! RecipeInstructionsCell
cell.selectionStyle = .none
cell.indexPath = indexPath
cell.tableViewMaster = self.creationTableView
//cell.cellTextView.tag = indexPath.row
cell.delegate = self

cell.cellTextView.text = ““

if indexPath.section == 0 && indexPath.row < temporaryRecipeItem.ingredients.count && !temporaryRecipeItem.ingredients.isEmpty {
cell.cellTextView.text = temporaryRecipeItem.ingredients[indexPath.row]
} else if indexPath.row < temporaryRecipeItem.instructions.count && !temporaryRecipeItem.instructions.isEmpty {
cell.cellTextView.text = temporaryRecipeItem.instructions[indexPath.row]
}

return cell

}

关于swift - UITableview 将单元​​格移动到错误的部分,并用空白单元格替换其先前的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245237/

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