2016-01-12 4 views
0

Я следил за учебником Swift, который использовал xib-файл в качестве контроллера представлений и пытался попасть в раскадровку. Я использую xCode7 и Swift 2.1 Я получаю некоторую проблему для кодов ниже, в частности:Как преобразовать xCode xib-контроллер на контроллер раскадровки?

var cell:CatsTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CatsTableViewCell 

     if(cell == nil) { 
      cell = NSBundle.mainBundle().loadNibNamed("CatsTableViewCell", owner: self, options: nil)[0] as? CatsTableViewCell 
     } 

Как я могу перевести этот выше в один, чтобы использовать в проекте с раскадровки?

У меня есть некоторые проблемы и здесь. Я начал использовать xCode не так давно, и я немного запутался в значении кода ниже. Я попытался это сделать, но я просто получил очень подробное объяснение, которое трудно понять как новичок.

required init(coder aDecoder:NSCoder) 
    { 
     fatalError("NSCoding not supported") 
    } 

Здесь ниже вы можете найти весь код контроллера и ссылку на полный учебник. Надеюсь, кто-нибудь может мне помочь, пожалуйста. Заранее спасибо.

http://www.appcoda.com/instagram-app-parse-swift/

// 
// CatsTableViewController.swift 
// Paws 
// 
// Created by Simon Ng on 15/4/15. 
// Copyright (c) 2015 AppCoda. All rights reserved. 
// 

import UIKit 

class CatsTableViewController: PFQueryTableViewController { 


    let cellIdentifier:String = "CatCell" 

    override func viewDidLoad() { 


    tableView.registerNib(UINib(nibName: "CatsTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) 

     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func queryForTable() -> PFQuery { 
     let query:PFQuery = PFQuery(className:self.parseClassName!) 


     if(objects?.count == 0) 
     { 
      query.cachePolicy = PFCachePolicy.CacheThenNetwork 
     } 

     query.orderByAscending("name") 

     return query 

    } 

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


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? { 

     var cell:CatsTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CatsTableViewCell 

     if(cell == nil) { 
      cell = NSBundle.mainBundle().loadNibNamed("CatsTableViewCell", owner: self, options: nil)[0] as? CatsTableViewCell 
     } 

     cell?.parseObject = object 

     if let pfObject = object { 
      cell?.catNameLabel?.text = pfObject["name"] as? String 

      var votes:Int? = pfObject["votes"] as? Int 
      if votes == nil { 
       votes = 0 
      } 
      cell?.catVotesLabel?.text = "\(votes!) votes" 

      var credit:String? = pfObject["cc_by"] as? String 
      if credit != nil { 
       cell?.catCreditLabel?.text = "\(credit!)/CC 2.0" 
      } 

      cell?.catImageView?.image = nil 
      if var urlString:String? = pfObject["url"] as? String { 
       var url:NSURL? = NSURL(string: urlString!) 

       if var url:NSURL? = NSURL(string: urlString!) { 
        var error:NSError? 
        var request:NSURLRequest = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReturnCacheDataElseLoad, timeoutInterval: 5.0) 

        NSOperationQueue.mainQueue().cancelAllOperations() 

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: { 
         (response:NSURLResponse?, imageData:NSData?, error:NSError?) -> Void in 

         cell?.catImageView?.image = UIImage(data: imageData!) 

        }) 
       } 
      } 

     } 

     return cell 
    } 

    override init(style: UITableViewStyle, className: String!) 
    { 
     super.init(style: style, className: className) 

     self.pullToRefreshEnabled = true 
     self.paginationEnabled = false 
     self.objectsPerPage = 25 

     self.parseClassName = className 

     self.tableView.rowHeight = 350 
     self.tableView.allowsSelection = false 
    } 

    required init(coder aDecoder:NSCoder) 
    { 
     fatalError("NSCoding not supported") 
    } 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 

ответ

0

Изменения ниже кода

var cell:CatsTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CatsTableViewCell 

    if(cell == nil) { 
     cell = NSBundle.mainBundle().loadNibNamed("CatsTableViewCell", owner: self, options: nil)[0] as? CatsTableViewCell 
    } 

в

let cell = tableView.dequeueReusableCellWithIdentifier("CatsTableViewCell", forIndexPath: indexPath) as! CatsTableViewCell 

И для "требуется" ключевой слово проверки связи What does the "required" keyword in Swift mean?

+0

Также обратите внимание, что вам не понадобится метод init, помеченный как обязательный, после использования раскадровки - вы должны вынуть init и вместо этого используйте viewDidLoad для вашей настройки. – pbergson

+0

Спасибо за ответы! У меня есть изменение var "...", чтобы ".." и удалили методы init. Теперь в viewDidLoad есть: tableView.registerNib (UINib (nibName: «CatsTableViewCell», bundle: nil), forCellReuseIdentifier: cellIdentifier) ​​Как я могу настроить viewDidLoad, пожалуйста? @pbergson – greencup

+0

Ваш viewController должен иметь свойство для tableview, например: – pbergson

0

Вашего об iewController должны иметь свойство для Tableview, как это:

@IBOutlet var tableview : UITableView? 

Затем в раскадровке, подключите TableView к этой розетке (учебники по подключению розетки имеются в большом количестве, или дайте мне знать, если вы застряли). Затем в viewDidLoad вызовите тот же самый метод, который у вас выше: self.tableView.registerNib и т. Д.

+0

Спасибо @pbergson, я сделал это, но я получаю эту ошибку: «NSInternalInconsistencyException», причина: «не удалось удалить ячейку с идентификатором CatsTableViewCell - необходимо зарегистрировать nib или класс для идентификатора или подключить ячейку прототипа в раскадровке «..... но если бы я использовал этот код: let cell = tableView.dequeueReusableCellWithIdentifier (« CatsTableViewCell », forIndexPath: indexPath) как! CatsTableViewCell ..... приложение не будет разбиваться, но не отображает изображения в ячейках. – greencup

Смежные вопросы