Текст, перекрывающий текст, который должен был быть удален - PullRequest
0 голосов
/ 07 января 2019

enter image description here Привет, так что это мой vc для вида, где я сохраняю информацию о самолете (тип и rego). Он сохраняет плоскость и удаляет, и вы можете закрыть приложение и вернуться, и он сохраняет его там в базовой модели данных, но у меня есть странная проблема. После создания плоскости, которая отображается в табличном представлении и добавляется еще несколько плоскостей (ячейка табличного представления, содержащая информацию), тогда метки, отображающие информацию, начинают перекрываться с информацией, которая должна быть удалена. Фотографии ниже показывают, что я имею в виду. Любая помощь будет принята с благодарностью. 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 голосов
/ 07 января 2019

Вы добавляете новые подпредставления в свою ячейку каждый раз, когда эта ячейка снимается.


Я бы порекомендовал вам создать эти представления, метки и т. Д. Как 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
...
0 голосов
/ 07 января 2019

UITableView повторно использует ячейки. В вашем случае, когда ячейки создаются в первый раз, вы добавляете UILabel к нему. При следующей загрузке этой ячейки UITableView повторно использует существующую ячейку, а cellForRowAt добавляет еще одну UILabel в эту ячейку. Правильная реализация - создать пользовательский UITableViewCell и сбросить значение всех атрибутов в методе cellForRowAt.

Вы можете попробовать что-то вроде ниже (обратите внимание, что это просто грубая реализация, и предполагается, что вы знаете основы программирования на ios. Если это не так, я бы рекомендовал немного исследовать это):

Добавление пользовательской ячейки табличного представления

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 s. Затем в вашем 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
}
...