gpt4 book ai didi

ios - 小部件在表格 View swift ios的单元格中相互重叠

转载 作者:可可西里 更新时间:2023-10-31 23:59:47 27 4
gpt4 key购买 nike

我根据数组 widgetInstockArray 中提供的元素在 TableView 的单元格中获取小部件 textFieldtextView。并从 labelInstcokArray

获取小部件的占位符

问题:Cell 出现时两个小部件重叠,textField 包含在每个单元格的 textView 中。

我想要的:每个单元格中应该有一个 textField 或 textView,但不能同时包含和重叠。

这是我到目前为止所做的:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextViewDelegate {

var widgetInstockArray = [String]()
var labelInstockArray = [String]()
var idInstockArray = [IntegerLiteralType]()
var newLabel = UITextField()
var newTextView = UITextView()
let wTextField = "textField"
let wTextView = "textView"

@IBOutlet weak var firstTableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()
widgetInstockArray = [wTextView, wTextField, wTextView, wTextField, wTextField, wTextView, wTextField]
idInstockArray = [1,2,3,4,5,6,7]
labelInstockArray = ["1ok","2ok","3ok","4ok","5ok","6ok","7ok"]
firstTableView.delegate = self
firstTableView.dataSource = self
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return widgetInstockArray.count
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var Cell : UITableViewCell?

var instockTag : Int = 1
Cell = firstTableView.dequeueReusableCell(withIdentifier: "firstCell")! as UITableViewCell
if widgetInstockArray.count == 0 && labelInstockArray.isEmpty {
print("no textFields in instock")
}
else {
print("widget process i in winstock loop")
for i in widgetInstockArray {
print("widget process i in winstock loopok so here is \(i)")
let indexOfA = widgetInstockArray.index(of: i)
print("her is the index of i of widgets \(String(describing: indexOfA))")
if i.contains(wTextField) {
print("textField was placed")
newLabel = UITextField(frame: CGRect(x: 10, y: 10, width: 200, height: 30))
newLabel.textColor = UIColor.gray
newLabel.tag = instockTag
print("You have a instock textLabel with tag \(newLabel.tag)")
if labelInstockArray.isEmpty || idInstockArray.count != labelInstockArray.count {
newLabel.text = " "
} else {
newLabel.placeholder = labelInstockArray[indexPath.row]
newLabel.layer.cornerRadius = 3
newLabel.layer.borderColor = UIColor.gray.cgColor
newLabel.layer.borderWidth = 1
instockTag += 1
print("\(widgetInstockArray.count)")
Cell?.contentView.addSubview(newLabel)
}
}

if i.contains(wTextView) {
print("textView was placed")
newTextView = UITextView(frame: CGRect(x:10, y: 10, width: 200, height: 60))
newTextView.textAlignment = NSTextAlignment.justified
newTextView.textColor = UIColor.black
newTextView.backgroundColor = UIColor.white
newTextView.font = UIFont.systemFont(ofSize: 15)
newTextView.tag = instockTag
print("You have a instock textView with tag \(newTextView.tag)")
if labelInstockArray.isEmpty || idInstockArray.count != labelInstockArray.count {
} else {
//newTextView.text = labelInstockArray[indexPath.row]
newTextView.layer.cornerRadius = 3
newTextView.layer.borderColor = UIColor.gray.cgColor
newTextView.layer.borderWidth = 1
instockTag += 1
print("\(widgetInstockArray.count)")
Cell?.contentView.addSubview(newTextView)
}
}
}
print("could not add widgets")
}
return Cell!
}

func textViewDidBeginEditing(_ textView: UITextView) {
if newTextView.textColor == UIColor.lightGray {
newTextView.text = nil
newTextView.textColor = UIColor.black
}
}

func textViewDidEndEditing(_ textView: UITextView) {
if newTextView.text.isEmpty {
for i in labelInstockArray {
newTextView.text = i
}
newTextView.textColor = UIColor.lightGray
}
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

输出重叠:(
textFiled 在 textview 中,两者都出现在一个单元格中。但我希望它们不应该重叠,并且每个单元格中应该只有一个小部件。

enter image description here


根据 THIS ANSWER 更新

如果我想在按钮点击时添加小部件怎么办,这样每次点击时都应该添加小部件。

这是我做的

var idWidgetIs = IntegerLiteralType()
var labelWidget = String()
var widgetName = String()

let stockArray: [StockItem] = [ StockItem(id: idWidgetIs, label: labelWidget, widget: widgetName)]

@IBAction func textViewAct(_ sender: Any) {
idWidgetIs += 1
labelWidget = "placeholder"
StockItem.init(id: idWidgetIs, label: labelWidget, widget: .textView)
}

@IBAction func textFieldAct(_ sender: Any) {
idWidgetIs += 1
labelWidget = "placeholder"
StockItem.init(id: idWidgetIs, label: labelWidget, widget: .textField)
}

最佳答案

问题

1) 您正在以编程方式添加 subview 。由于单元格被重用,因此您每次都在创建 TextField 和 TextView

2) 我在您的代码中看到的另一个问题是 i.contains(wTextField)
i.contains(wTextView) 这将始终为真,因为 wTextFieldwTextView 都在数组 widgetInstockArray 并且两个框架都是 CGRect(x: 10, y: 10, width: 200, height: 30) 所以你得到它重叠


更好的解决方案是使用 UIStackView

使用 UIStackview 创建自定义单元格

现在添加一个 UITextField 和一个 UITextViewUIStackview

现在下一步是在 cellForRow 方法中。只需隐藏其他元素,如

if i == wTextField  { 
cell.wTextView.isHidden = true
cell.wTextField.isHidden = false

} else {
cell.wTextField.isHidden = true
cell.wTextView.isHidden = false

}

当您在 UIStackView 中隐藏其中一个 View 时,其他元素会自动相应设置

希望对你有帮助,如有疑问请私信我

更新

不相关,但保留两个数组来填充 tableview 不是好的做法,这可能对 future 的更新代码有问题。

更好的解决方案是创建 structclass

喜欢

enum Widget {
case TextField
case TextView
}
struct StockArray {
var type : Widget
var labelInstockArray = [String]()
var idInstockArray = [IntegerLiteralType]()
}

现在您可以创建 StockArray 数组,并且非常容易维护

宾果游戏!

关于ios - 小部件在表格 View swift ios的单元格中相互重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270702/

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