文字重叠应删除的文字

时间:2019-01-07 08:03:14

标签: swift uitableview core-data save sql-delete

enter image description here嗨,这是我的vc视图,用于保存有关飞机的信息(类型和重做)。它保存了平面并删除了,您可以关闭应用程序然后再回来,并将其保存在核心数据模型中,但是我有一个奇怪的问题。制作平面并将其显示在表格视图中并添加更多平面(具有信息的表格视图单元格)后,显示信息的标签开始与应删除的信息重叠。下面的图片说明了我的意思。任何帮助将不胜感激。 enter image description here

var context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

var typeField: UITextField?
var regoField: UITextField?

@IBAction func addPlaneButton(_ sender: Any) {

   let alertController = UIAlertController(title: "New Plane", message: "Please Input The Type And Registration", preferredStyle: .alert)
    alertController.addTextField(configurationHandler: typeField)
    alertController.addTextField(configurationHandler: regoField)

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    let saveAction = UIAlertAction(title: "Save", style: .default, handler: self.savePlane)

    alertController.addAction(cancelAction)
    alertController.addAction(saveAction)

    self.present(alertController, animated: true)


    print("Add Plane Pressed")
}

func typeField(textField: UITextField!) {
    typeField = textField
    typeField?.placeholder = "Aircraft Type"
}

func regoField(textField: UITextField!) {
    regoField = textField
    regoField?.placeholder = "Aircraft Registration"
}



@IBOutlet weak var tableView: UITableView!

var timer = Timer()

let utcItem = UIBarButtonItem()
let utcLbl = UILabel()


override func viewDidLoad() {
    super.viewDidLoad()

    //Table View
    tableView.delegate = self
    tableView.dataSource = self
    self.tableView.rowHeight = 88

    setupView()

}


            //////Functions////


func setupView() {
    //UTC Time Formatter
    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = "HH:mm"
    _ = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)

    //UTC Time
    utcLbl.frame = CGRect(x: 0, y: 0, width: 100, height: 20)
    utcLbl.text = "\(dateFormatter.string(from: Date())) UTC"
    utcItem.customView = utcLbl
    utcLbl.backgroundColor = UIColor.init(fromHexCode: "4FB7F1")
    utcLbl.layer.cornerRadius = 10
    utcLbl.textAlignment = .center
    utcLbl.layer.masksToBounds = true // Or utcLbl.clipsToBounds = true
    self.navigationItem.setLeftBarButtonItems([utcItem], animated: true)

    // Large Title
    self.title = "Planes"
    self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.font: UIFont(name: "Avenir-Black", size: 35)!]
    self.navigationController?.navigationBar.prefersLargeTitles = true
    let customBlue = UIColor(red:0.08, green:0.38, blue:0.75, alpha:1.0)
    navigationController?.navigationBar.barTintColor = customBlue
}

//Constant UTC Time Lbl
@objc func updateTime() {
    let formatter = DateFormatter()
    formatter.timeZone = TimeZone(abbreviation: "UTC")
    formatter.dateFormat = "HH:mm"
    utcLbl.text = formatter.string(from: Date()) + " UTC"
}

//Save the Plane Info

func savePlane(alert: UIAlertAction) {

    if typeField?.text != "" || regoField?.text != "" {

        let newLog = NSEntityDescription.insertNewObject(forEntityName: "Planes", into: context)
        newLog.setValue(self.typeField?.text, forKey: "type")
        newLog.setValue(self.regoField?.text, forKey: "rego")

        do{
            try context.save()
        }
        catch {
            print(error)
        }

        //Making the table update itself when user logs the plane
        self.fetchData()
        self.tableView.reloadData()

    }
    print("Plane Saved")
}

func fetchData() {
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


    do{
        planeArray = try context.fetch(Planes.fetchRequest())
    }
    catch{
        print(error)
    }
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    if editingStyle == .delete {
        let save = planeArray[indexPath.row]
        context.delete(save)
        (UIApplication.shared.delegate as! AppDelegate).saveContext()

        do {
            planeArray = try context.fetch(Planes.fetchRequest())
        }
        catch {
            print(error)
        }
        tableView.reloadData()
    }
}


//Table View Functions

public func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    //Plane Pic
    let planeView = UIImageView()
    planeView.frame = CGRect(x: 0, y: 0, width: 69, height: 67)
    //planeView.center = CGPoint(x: cell.center.x - 150, y: cell.center.y)
    planeView.center = CGPoint(x: cell.center.x - 145, y: cell.center.y)
    let planeImage: UIImage = UIImage(named: "plane")!
    planeView.image = planeImage
    cell.addSubview(planeView)

    //Type Label
    let type = UILabel()
    type.frame = CGRect(x: 0, y: 0, width: 45, height: 21)
    type.center = CGPoint(x: cell.center.x - 80, y: cell.center.y - 22.5)
    type.text = "Type:"
    type.font = UIFont(name: "Montserrat-Medium", size: 17)
    cell.addSubview(type)

    //Type Answer
    let typeAnswer = UILabel()
    typeAnswer.frame = CGRect(x: 0, y: 0, width: 220, height: 21)
    typeAnswer.center = CGPoint(x: cell.center.x + 62.5, y: cell.center.y - 22.5)
    typeAnswer.text = ""
    typeAnswer.font = UIFont(name: "Montserrat-Light", size: 17)
    typeAnswer.textAlignment = .right
    cell.addSubview(typeAnswer)

    //Rego Label
    let rego = UILabel()
    rego.frame = CGRect(x: 0, y: 0, width: 110, height: 21)
    rego.center = CGPoint(x: cell.center.x - 47.5, y: cell.center.y + 18.5)
    rego.text = "Registration:"
    rego.font = UIFont(name: "Montserrat-Medium", size: 17)
    cell.addSubview(rego)

    //rego answer
    let regoAnswer = UILabel()
    regoAnswer.frame = CGRect(x: 0, y: 0, width: 160, height: 21)
    regoAnswer.center = CGPoint(x: cell.center.x + 92.5, y: cell.center.y + 18.5)
    regoAnswer.text = ""
    regoAnswer.font = UIFont(name: "Montserrat-Light", size: 17)
    regoAnswer.textAlignment = .right
    cell.addSubview(regoAnswer)

    let save = planeArray[indexPath.row]
    typeAnswer.text = save.type
    regoAnswer.text = save.rego
    return cell
}


override func viewWillAppear(_ animated: Bool) {
    //Making the table update itself when user logs the plane
    fetchData()
    tableView.reloadData()
}

}

2 个答案:

答案 0 :(得分:0)

UITableView重用单元格。在您的情况下,首次创建单元格时,您要向其中添加UILabel。下次加载此单元格时,UITableView重用现有单元格,而cellForRowAt向该单元格添加另一个UILabel。正确的实现是创建一个自定义UITableViewCell并重置cellForRowAt方法中所有属性的值。

您可以尝试以下类似操作(请注意,这只是一个粗略的实现,并且假设您了解ios编程的基础。如果不是这种情况,建议您进行一些研究):< / p>

添加自定义表格视图单元格

class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var imgViewPlane: UIImageView!
    @IBOutlet weak var lblType: UILabel!
    @IBOutlet weak var lblTypeAnswer: UILabel!
    @IBOutlet weak var lblRego: UILabel!
    @IBOutlet weak var lblRegoAnswer: UILabel!
}

在情节提要表视图中创建一个动态原型单元,并链接IBOutlet。然后在您的cellForRowAt中,执行类似的操作

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomTableViewCell

    cell.imgViewPlane.image = planeImage
    cell.lblType.text = "Type:"
    cell.lblTypeAnswer.text = planeArray[indexPath.row].type
    cell.lblRego.text = "Registration:"
    cell.lblRegoAnswer.text = planeArray[indexPath.row].rego

    return cell
}

答案 1 :(得分:0)

每次将单元从列队中出队时,您都会向其单元中添加新的子视图。


我建议您将这些视图,标签等创建为lazy子类中的UITableViewCell变量,并将它们作为子视图添加到awakeFromNib()

class YourCell: UITableViewCell {

    lazy var label: UILabel = {
        var label = UILabel(...)
        ...
        return label
    }()
    ...
    override func awakeFromNib() {
        addSubview(label)
        ...
    }
}

....。如果使用情节提要,请使用IBOutlet

然后cellForRowAt中的内容只是更改您向下转换的单元子类视图的属性

let cell = ... as! YourCell
cell.label.text = ""
cell.anotherLabel.isHidden = true
...