No estoy seguro de por qué, pero tengo un botón y un campo de texto en mi viewController, el botón no es visible cuando aparece la vista, pero cuando hago clic donde debería estar el botón, aparece. El texto rellenado previamente en el cuadro de texto tampoco aparece.

Se me presenta la siguiente advertencia (no estoy seguro de si está relacionada):

2016-12-30 11: 25: 26.030 wellpleased [5462: 776953] Esta aplicación está modificando el motor de diseño automático desde un subproceso en segundo plano después de que se accedió al motor desde el subproceso principal. Esto puede provocar daños en el motor y fallas extrañas.

¿Cómo puedo evitar esta advertencia y hacer que los elementos aparezcan correctamente?

class events: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var rowID:String = ""
    var value:String!
    
    @IBOutlet var tableView: UITableView!
    var tableData: [String] = []
    var tableEventMonth: [String] = []
    var tableEventDay: [String] = []
    var tableEventCity: [String] = []
    var tableEventLink: [String] = []
    var tableEventID: [String] = []
    
    @IBOutlet weak var tableTopConstraint: NSLayoutConstraint!
    @IBOutlet weak var eventCodeView: UIView!
 
    @IBAction func addButton(_ sender: Any) {
 
            if self.eventCodeView.alpha == 1{
                
                
                self.view.layoutIfNeeded()
                UIView.animate(withDuration: 1, animations: {
                    self.view.layoutIfNeeded()
                    self.eventCodeView.alpha = 0
                    })
                
                
                
                self.tableTopConstraint.constant = 1
                UIView.animate(withDuration: 1) {
                    self.view.layoutIfNeeded()
                    
                }
            }else{
                
               
                self.view.layoutIfNeeded()
                UIView.animate(withDuration: 1, animations: {
                    self.view.layoutIfNeeded()
                    self.eventCodeView.alpha = 1
                    
                })
                
                
                
                self.tableTopConstraint.constant = 70
                UIView.animate(withDuration: 1) {
                    self.view.layoutIfNeeded()
                    }
        }
        
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let nib = UINib(nibName: "vwTblCell", bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: "cell")
    
    }
    
    override func viewDidAppear(_ animated: Bool) {
        
         getTableData()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tableData.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 	{
        let cell: TblCell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as! TblCell

        cell.lblCarName.text = self.tableData[indexPath.row]
        cell.calendarDay.text = self.tableEventDay[indexPath.row]
        cell.calendarMonth.text = self.tableEventMonth[indexPath.row]
        cell.city.text = self.tableEventCity[indexPath.row]
        
        let defaults = UserDefaults()
        let event = defaults.string(forKey: "event")
        
        if self.tableData[indexPath.row] == event {
        cell.hereLabel.isHidden = false
        }
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Row \(indexPath.row) selected")
        
        rowID = tableEventID[indexPath.row]
        self.performSegue(withIdentifier: "goAttendees", sender: self)
        
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 90
    }

    func getTableData(){
        
        let defaults = UserDefaults()
        let userid = defaults.string(forKey: "id")
    
    let url = NSURL(string: "https://www.asmserver.co.uk/wellpleased/backend/eventselect.php?userid=\(userid!)")

        let task = URLSession.shared.dataTask(with: url as! URL) { (data, response, error) -> Void in
           
            if let urlContent = data {
                
                do {
                    
                    if let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: []) as? [[String:AnyObject]] {
                        
                        
                        var i = 0
                        
                        while i < jsonResult.count {
                            
                            
                            self.tableData.append(jsonResult[i]["eventname"]! as! String)
                            self.tableEventDay.append(jsonResult[i]["eventday"]! as! String)
                            self.tableEventMonth.append(jsonResult[i]["eventmonth"]! as! String)
                            self.tableEventCity.append(jsonResult[i]["city"]! as! String)
                            self.tableEventLink.append(jsonResult[i]["link"]! as! String)
                            self.tableEventID.append(jsonResult[i]["eventid"]! as! String)
                            

                            
                            
                            i = i + 1
                            
                        }
                        
                    }
                    
                } catch {
                    
                    print("JSON serialization failed")
                    
                }
                
            } else {
                
                print("ERROR FOUND HERE")
            }
            
            
            DispatchQueue.main.async(execute: { () -> Void in
                
                self.tableView.reloadData()
                
            })
            
            self.tableView.isUserInteractionEnabled = true
        }
        
        task.resume()

            }

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    
    if(segue.identifier == "goAttendees") {
        
        let attendees = (segue.destination as! attendees)
        attendees.value = rowID
        
    }

  }

}
1
MattBlack 30 dic. 2016 a las 14:42
1
Cámbielo de "DispatchQueue.main.async (execute: {() -> Void in self.tableView.reloadData ()})" a "dispatch_async (dispatch_get_main_queue (), {self.tableView.reloadData ()})"
 – 
Ramkrishna Sharma
30 dic. 2016 a las 15:11
¡Gracias! Eso solucionó el error, pero los elementos de mi interfaz aún no se muestran correctamente. El botón no está visible cuando se carga la página, ¿alguna idea de por qué está sucediendo esto?
 – 
MattBlack
30 dic. 2016 a las 15:17
Puede estar relacionado con su restricción de Autodiseño.
 – 
Ramkrishna Sharma
30 dic. 2016 a las 15:57
 – 
LF00
17 may. 2017 a las 10:53

1 respuesta

La mejor respuesta

Será mejor que cambie la interfaz de usuario solo en el hilo principal. Para swift3, consulte esta publicación,

Para obtener más swift <2, 3 objetivo-c.

0
Community 23 may. 2017 a las 15:26