2017-05-13 23 views
0

我有我的应用程序的一部分,这个实施后:无法从视图去另一个做一些说明

为什么当我点击“CERCA每ISBN”按钮,它进入的tableView没有做我写的说明?

这是“CERCA每ISBN”按钮的代码,我点击:

@IBAction func ISBNButtonClick(_ sender: Any) { 

    let libro = Libro.text! as String 

    if Libro.text!.isEmpty { 

     //Alert per segnalare i campi mancanti, oltre a caselle rosse 

     var myAlert = UIAlertController(title:"Attenzione\n", message:"Inserire il codice ISBN", preferredStyle:UIAlertControllerStyle.alert); 

     let okAction = UIAlertAction(title:"Ok", style:UIAlertActionStyle.default){ action in } 

     myAlert.addAction(okAction); 
     self.present(myAlert, animated:true, completion:nil); 

     // placeholder rosso se la text è vuota 

     Libro.attributedPlaceholder = NSAttributedString(string:"Digita qui...", attributes: [NSForegroundColorAttributeName: UIColor.red]) 

     //se tutti i campi obbligatori sono stati inseriti, proseguo ad altri controlli 
    }else{ 
     if(isNumeric(string: libro)){ 
      if((libro.characters.count) < 13 || (libro.characters.count) > 13){ 

       //Alert per segnalare l'ISBN più corto di 13 numeri 

       var myAlert = UIAlertController(title:"Attenzione\n", message:"L'ISBN deve essere di 13 cifre", preferredStyle:UIAlertControllerStyle.alert); 

       let okAction = UIAlertAction(title:"Ok", style:UIAlertActionStyle.default){ action in } 

       myAlert.addAction(okAction); 
       self.present(myAlert, animated:true, completion:nil); 
      }else{ 
       //inviare dati al server 
       let myUrl = NSURL(string:"http://chuadiv.ddns.net/easytoschool/fetch_book_detailed.php"); 

       let request = NSMutableURLRequest(url:myUrl as! URL); 
       request.httpMethod = "POST"; 
       let postString = "name=\(libro)&mail=\(UserDefaults.standard.object(forKey: "userEmail") as? String)"; 
       request.httpBody = postString.data(using: String.Encoding.utf8); 

       let task = URLSession.shared.dataTask(with: request as URLRequest){ 
        data, response, error in 

        if error != nil{ 
         print("error=\(error)") 
         return 
        } 

        var err: NSError? 

        do{ 
         var json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray 


         if let parseJSON: NSArray = json{ 

          for index in 0...parseJSON.count-1 { 

           print("ciao") 
           let libro = parseJSON[index] as! [String:Any] 
           print("\n\n",index,":\n") 

           let book = resultCell.init(bookId: libro["id"] as! String,bookName: libro["name"] as! String,bookAuthor: libro["author"] as! String,bookSchool: libro["school"] as! String,bookPrice: libro["price"] as! String,bookStatus: libro["status"] as! String,bookISBN: libro["isbn"] as! String,bookType: libro["type"] as! String,bookIdSeller: libro["idSeller"] as! String,bookNameSeller: libro["nameSeller"] as! String,bookSurnameSeller: libro["surnameSeller"] as! String) 

           book.printBook(); 

           HomeViewController.booksArray.append(book) 
          } 

         } 
        }catch{ 
         print("error=\(error)") 
         return 
        } 
       } 
       task.resume(); 

       performSegue(withIdentifier: "homeToListBook", sender: self) 

      } 
     }else{ 
      var myAlert = UIAlertController(title:"Attenzione\n", message:"Inserire solo numeri per la ricerca attraverso codice ISBN", preferredStyle:UIAlertControllerStyle.alert); 

      let okAction = UIAlertAction(title:"Ok", style:UIAlertActionStyle.default){ action in } 

      myAlert.addAction(okAction); 
      self.present(myAlert, animated:true, completion:nil); 
     } 
    } 
} 

我想,当我按下按钮,设置我的数组并把它转到的tableView后,但我可以“T

回答

0

问题是,dataTask的完成块将调用异步,以便稍后调用,并且当前正在其完成块之外执行segue。所以你需要做的就是在Main线程的dataTask的完成块内调用performSegue。还使用URLURLRequest代替NSURLNS(Mutable)URLRequest

let myUrl = URL(string:"http://chuadiv.ddns.net/easytoschool/fetch_book_detailed.php") 

let request = URLRequest(url:myUrl!) 
request.httpMethod = "POST"; 
let postString = "name=\(libro)&mail=\(UserDefaults.standard.string(forKey: "userEmail")!)" 
request.httpBody = postString.data(using: .utf8) 
let task = URLSession.shared.dataTask(with: request as URLRequest){ 
    data, response, error in 

    if error != nil{ 
     print("error=\(error)") 
     return 
    } 

    var err: NSError? 

    do{ 
     var json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [[String:Any]] 


     if let parseJSON = json {     
      for libro in in parseJSON {           
       let book = resultCell.init(bookId: libro["id"] as! String,bookName: libro["name"] as! String,bookAuthor: libro["author"] as! String,bookSchool: libro["school"] as! String,bookPrice: libro["price"] as! String,bookStatus: libro["status"] as! String,bookISBN: libro["isbn"] as! String,bookType: libro["type"] as! String,bookIdSeller: libro["idSeller"] as! String,bookNameSeller: libro["nameSeller"] as! String,bookSurnameSeller: libro["surnameSeller"] as! String) 

       book.printBook(); 

       HomeViewController.booksArray.append(book) 
      } 

      //Perform segue now 
      DispatchQueue.main.async { 
       performSegue(withIdentifier: "homeToListBook", sender: self) 
      }     
     } 
    }catch{ 
     print("error=\(error)") 
     return 
    } 
} 
task.resume() 

注:在夫特使用SWIFT本地类型阵列和词典,而不是NSArrayNSDictionary

+0

我写了你的代码部分,但它不起作用。它会立即转到另一个视图而不打印“if part” – Marco

+0

在另一个视图中,我想先打印数组,但它告诉“索引超出范围”;我认为这是因为它立即进入视图没有设置数组 – Marco

+0

而我在我的应用的另一部分有这种错误 – Marco

0

要附加项目到另一个实例的数组,甚至一些静止无功而不是通过它

你应该做的是创建类的Book与所有属性

class Book { 
    let id: String 
    init(data: [String:Any]) { 
     self.id = data["id"] as? String ?? "" //or some other error handling 
    } 
} 

然后创建书籍内部数组目前UIViewController

var books: [Book] = []

然后像做

let book = Book(data: libro) 
books.append(book) 

传递数据,您应该创建的目标控制器内部书籍阵列(HomeViewController

设置其DataSource a ND Delegate功能使用这种阵列

创建UITableViewCells和传递数据等

override func prepare(for segue: UIStoryboardSegue, sender _: Any?) { 
    if segue.identifier == "homeToListBook" { 
     if let destinationVC = segue.destination as? HomeViewController { 
      destinationVC.books = self.books 
     } 
    } 
} 

编辑: 和Nirav d提到的,SEGUE应当在主线程数据被解析之后称为,没有注意到这个