2016-09-02 13 views
0

私はしばらくスタックしていましたが、何らかの検索の後にいつも答えを見つけたので質問する必要はありませんでしたリアル。私は周りを探索していたし、答えのためのいくつかの試行錯誤を経て、私は同じエラーが発生し続けている。私は基本的に画面の下半分にtableViewを持つプロファイルページを作っています。上半分は、現在のユーザーの情報を細かく塗りつぶしています。ビューコントローラとセルビューコントローラへのすべての接続は良いようです。致命的なエラーでロード中にテーブルビューが、しかし、データなしとクラッシュして表示されます。テーブルビューを読み込むときにオプションの値をアンラッピングしている間に予期せずnilが見つかりました

unexpectedly found nil while unwrapping an optional value.

私はまた、「テスト」は、ログに印刷されていないためcellForRowAtIndexPathがまったく呼び出されていないと信じています。

私はSwiftとParseの最新バージョンを使用しています。

私は比較的迅速で、私のコード全体をここに掲載して助けてくれれば幸いです。

import UIKit 
import Parse 
import ParseUI 

class profileViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 


@IBOutlet var tableView: UITableView! 
@IBOutlet var profilePic: UIImageView! 
@IBOutlet var userName: UILabel! 
@IBOutlet var userBio: UILabel! 
var image: PFFile! 
var username = String() 
var userbio = String() 
var content = [String]() 


@IBAction func logout(sender: AnyObject) { 
    PFUser.logOut() 
    let Login = storyboard?.instantiateViewControllerWithIdentifier("ViewController") 
    self.presentViewController(Login!, animated: true, completion: nil) 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 


    profilePic.layer.borderWidth = 1 
    profilePic.layer.masksToBounds = false 
    profilePic.layer.borderColor = UIColor.blackColor().CGColor 
    profilePic.layer.cornerRadius = profilePic.frame.height/2 
    profilePic.clipsToBounds = true 


    tableView.delegate = self 
    tableView.dataSource = self 


    self.tableView.rowHeight = 80 


    self.hideKeyboardWhenTappedAround() 

    if let nameQuery = PFUser.currentUser()!["name"] as? String { 
     username = nameQuery 
    } 

    if PFUser.currentUser()!["bio"] != nil { 
    if let bioQuery = PFUser.currentUser()!["bio"] as? String { 
     userbio = bioQuery 
    } 
    } 

    if PFUser.currentUser()!["icon"] != nil { 
    if let iconQuery = PFUser.currentUser()!["icon"] as? PFFile { 
     image = iconQuery 
    } 
    } 



    self.userName.text = username 
    self.userBio.text = userbio 

    if image != nil { 
    self.image.getDataInBackgroundWithBlock { (data, error) -> Void in 


     if let downIcon = UIImage(data: data!) { 


      self.profilePic.image = downIcon 

     } 
     } 

    } 


    // Do any additional setup after loading the view. 

    var postsQuery = PFQuery(className: "Posts") 

    postsQuery.whereKey("username", equalTo: username) 

    postsQuery.findObjectsInBackgroundWithBlock({ (posts, error) -> Void in 

     if error == nil { 

      if let objects = posts { 
       self.content.removeAll(keepCapacity: true) 

       for object in objects { 
        if object["postText"] != nil { 
         self.content.append(object["postText"] as! String) 
        } 
        self.tableView.reloadData() 
       } 
      } 
     } 

    }) 

} 




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


func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    print(content.count) 
    return content.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let profCell = self.tableView.dequeueReusableCellWithIdentifier("profCell", forIndexPath: indexPath) as! profTableViewCell 

    print("test") 

    profCell.userPic.layer.borderWidth = 1 
    profCell.userPic.layer.masksToBounds = false 
    profCell.userPic.layer.borderColor = UIColor.blackColor().CGColor 
    profCell.userPic.layer.cornerRadius = profCell.userPic.frame.height/2 
    profCell.userPic.clipsToBounds = true 


    profCell.userPic.image = self.profilePic.image 
    profCell.name.text = self.username 




    profCell.content.text = content[indexPath.row] 



    return profCell 
} 

} 
+0

UIViewControllerコードにカスタムUITableViewCellクラスを登録していないようですか? – Woodstock

+0

可能であれば、このようなエラーの発生を防ぐために、mvar = yourvariable {}を使用するか、テーブルビューアウトレットを正しく接続し、デリゲートとデータソースを確認してください。 –

+0

どのラインがクラッシュしますか? – acorc

答えて

2

私はそれが数日間放置し、私は私が作った非常にダム間違いを実現するために戻ってきました。私は約15のView Controllerを使って作業していますが、上に掲載したものと同じ名前で重複しています。私は今、あなたがストーリーボードでの作業が非常に固いと言う理由を理解しています。しかし、私はそれを必要としませんでした、私は助けを感謝し、私はいくつかのことを学んだと言うことができます。

0

あなたはおそらく、あなたがカスタムUITableViewCellのために使用しているクラスを登録する必要があります:

self.tableView.registerClass(profTableViewCell.self, forCellReuseIdentifier: "profCell") 

あなたはIBで試作したセルを使用している場合を除き、この登録は、あなたのために自動的に行われていません。

デキューメソッド(!強制アンラップ)を呼び出すと、問題が発生します。 dequeueReusableCellWithIdentifier:forIndexPath:は、識別子にクラスまたはペン先を登録しなかった場合にアサートされます。 クラスを登録すると、常にがセルを返します。

この場合、古い(dequeueReusableCellWithIdentifier:)バージョンではnilが返され、独自のセルを作成できます。

asキャストでは、クラッシュを避けるためにキャストは行われますが、?を使用する必要があります。

もう一つの注意点は、クラス名には必ず大文字を使用してください。ProfTableViewCellではなくprofTableViewCellで、それはちょうど良い方法です。

ここでのiOS天才ロブMayoffによってトップの答えでは多くの情報に:Assertion failure in dequeueReusableCellWithIdentifier:forIndexPath:

+0

迅速な対応に感謝します。私は、問題がその行と正確に一致していると考えました。私はストーリーボード上の正しい再利用識別子を持つプロトタイプのセルを使用していました。しかし、私が自分のコンピュータに戻ったらすぐにこの方法を試して、私のケースでうまく動作しているかどうかを確認します。 – boppa

+0

ストーリーボードでプロトタイプのセルを使用している場合は、コード内のクラス。 – dan

0

あなたは、オプションの値として画像、ユーザ名とuserbioでシンプルなNSObjectのクラスを作成する必要があります。あなたのcellForRowAtIndexPathのアドオンで

var allProfiles = [yourNSObjectClass]() 

let profile = yourNSObjectClass() 
profile = allProfiles[indexPath.row] 

cell.username.text = profile.username 

そして、上に行く次に、あなたのprofileviewcontrollerにこのようなVARを宣言しなければなりません。

使用も、この:この代わりの

dispatch_async(dispatch_get_main_queue(), { 
       self.tableView.reloadData() 
      }) 

self.tableView.reloadData() 
+0

興味深いことがあります! findObjectsInBackgroundWithBlockは、常に独自のバックグラウンドスレッドで実行されますか? – Woodstock

+0

私の小さな経験ではい。このような問題を解決する良い方法です。 – Carlo

+0

私はこの修正プログラムを以前に試したが、同じエラーが発生しました。クラスを登録しても正しくコンパイルされない場合は、再度試してみる – boppa

関連する問題