2017-08-14 11 views
0

テーブルビューのセルでjsonデータを解析しようとしていて、解析しないでセルを表示していません。私はすべてのコードを添付しています。私は何をしているのか教えてください。私は何のエラーも出ませんが、セルは表示されません。私はjsonの解析と配列への格納のために別々のクラスと関数を作っています。テーブルビューのセルでalamofireを使用してjsonデータを解析する

// 
// ViewController.swift 
// WorkingFeed2 
// 
// Created by keshu rai on 08/08/17. 
// Copyright © 2017 keshu rai. All rights reserved. 
// 

import UIKit 
import Alamofire 
import MediaPlayer 

class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource{ 

var post : PostData! 
var posts = [PostData]() 
typealias DownloadComplete =() ->() 

var arrayOfPostData : [String] = [] 
@IBOutlet weak var feedTable: UITableView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    feedTable.dataSource = self 
    feedTable.delegate = self 


} 

func downloadPostData(completed: @escaping DownloadComplete) { 
    Alamofire.request("https://new.example.com/api/posts/get_all_posts").responseJSON { response in 
    let result = response.result 
    if let dict = result.value as? Dictionary<String,AnyObject> { 

     if let successcode = dict["STATUS_CODE"] as? Int { 
      if successcode == 1 { 
       if let postsArray = dict["posts"] as? [Dictionary<String,AnyObject>] 
       { 
       for obj in postsArray 
       { 
         let post = PostData(postDict: obj) 
         self.posts.append(post) 
         print(obj) 
        } 
//      self.posts.remove(at: 0) 
        self.feedTable.reloadData() 
       } 
      } 
     } 
    } 
    } 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 419 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell : ImageTableViewCell = self.feedTable.dequeueReusableCell(withIdentifier: "contentViewReuse") as! ImageTableViewCell 
    let post = posts[indexPath.row] 
    print(post) 
    cell.configureCell(post : post) 
    return cell 


} 
} 

これは私のPostDataクラスです。

import Foundation 

class PostData { 
var _profileImageURL : String? 
var _fullName : String? 
var _location : String? 
var _title : String? 
var _postTime : String? 
var _likes : Int? 
var _comments : Int? 
var _mediaType : String? 
var _contentURL : String? 
var _content : String? 
var _plocation : String? 

var profileImageURL : String 
{ 
    if _profileImageURL == nil { 
     _profileImageURL = "" 
    } 
    return _profileImageURL! 
} 

var fullName : String 
{ 
    if _fullName == nil { 
     _fullName = "" 
    } 
    return _fullName! 
} 
var location : String { 
    if _location == nil { 
     _location = "" 
    } 
    return _location! 
} 
var title : String { 
    if _title == nil { 
     _title = "" 
    } 
    return _title! 
} 

var postTime : String { 
    if _postTime == nil { 
     _postTime = "" 
    } 
    return _postTime! 
} 

var likes : Int { 
    if _likes == nil { 
     _likes = 0 
    } 
    return _likes! 
} 

var comments : Int { 
    if _comments == nil { 
     _comments = 0 
    } 
    return _comments! 
} 

var mediaType : String { 
    if _mediaType == nil { 
     _mediaType = "" 
    } 
    return _mediaType! 
} 

var contentURL : String { 
    if _contentURL == nil { 
     _contentURL = "" 
    } 
    return _contentURL! 
} 
var content : String { 
    if _content == nil { 
     _content = "" 
    } 
    return _content! 
} 
var pLocation : String { 
    if _plocation == nil { 
     _plocation = "" 
    } 
    return _plocation! 
} 






init(postDict : Dictionary<String , AnyObject>) 
{ 
    if let postsArray = postDict["posts"] as? [Dictionary<String,AnyObject>] 
    { 
     for i in 1..<postsArray.count 
     { 

      let fullName1 = postsArray[i]["full_name"] as? String 
      self._fullName = fullName1 


      let profileImageURL1 = postsArray[i]["profile_pic"] as? String 
      self._profileImageURL = profileImageURL1 

      let location1 = postsArray[i]["user_city"] as? String 
      self._location = location1 

      let title1 = postsArray[i]["title"] as? String 
      self._title = title1 

      let postTime1 = postsArray[i]["order_by_date"] as? String 
      self._postTime = postTime1 

      let likes1 = postsArray[i]["liked_count"] as? Int 
      self._likes = likes1 

      let comments1 = postsArray[i]["comment_count"] as? Int 
      self._comments = comments1 

      let mediaType1 = postsArray[i]["media_path"] as? String 
      self._mediaType = mediaType1 

      let contentURL1 = postsArray[i]["media_path"] as? String 
      self._contentURL = contentURL1 

      let content1 = postsArray[i]["content"] as? String 
      self._content = content1 

      let plocation1 = postsArray[i]["location"] as? String 
      self._plocation = plocation1 
     } 
    } 
} 
} 

これは私のPostDataTableViewCellコードです。あなたはViewControllerに一度PostDataに1回、2回のキーpostsの値を解析しようとしているため

import UIKit 
import Alamofire 

class PostDataTableViewCell: UITableViewCell { 



@IBOutlet weak var profileImage: UIImageView! 
@IBOutlet weak var titlePost: UILabel! 
@IBOutlet weak var profileFullName: UILabel! 
@IBOutlet weak var profileUserLocation: UILabel! 
@IBOutlet weak var likeBtn: UIButton! 
var buttonAction: (() -> Void) = {} 


var pressed = false 
@IBAction func likeBtnPressed(_ sender: Any) { 
    if !pressed { 
     let image = UIImage(named: "Like-1.png") as UIImage! 
     likeBtn.setImage(image, for: .normal) 
     pressed = true 
    } else { 

     let image = UIImage(named: "liked.png") as UIImage! 
     likeBtn.transform = CGAffineTransform(scaleX: 0.15, y: 0.15) 

     UIView.animate(withDuration: 2.0, 
         delay: 0, 
         usingSpringWithDamping: 0.2, 
         initialSpringVelocity: 6.0, 
         options: .allowUserInteraction, 
         animations: { [weak self] in 
         self?.likeBtn.transform = .identity 
      }, 
         completion: nil) 
     likeBtn.setImage(image, for: .normal) 
     pressed = false 
    } 


} 
@IBAction func commentBtnPressed(_ sender: Any) { 
    print("Commented") 

} 
@IBAction func shareBtnPressed(_ sender: Any) { 
    self.buttonAction() 


} 
@IBAction func readContentBtnPressed(_ sender: Any) { 
    print("Read") 

} 

@IBOutlet weak var contentPostLabel: UILabel! 

@IBOutlet weak var contentTypeView: UIView! 
@IBOutlet weak var likeAndCommentView: UIView! 
@IBOutlet weak var numberOfLikes: UILabel! 
@IBOutlet weak var numberOfComments: UILabel! 
@IBOutlet weak var postLocation: UILabel! 
@IBOutlet weak var postTimeOutlet: UILabel! 


func configureCell(post : PostData) 
{ 
    titlePost.text = "\(post.title)" 
    profileFullName.text = "\(post.fullName)" 
    profileUserLocation.text = "\(post.location)" 
    numberOfLikes.text = "\(post.likes) Likes" 
    numberOfComments.text = "\(post.comments) Comments" 
    postLocation.text = "\(post.pLocation)" 
    postTimeOutlet.text = "\(post.postTime)" 
     let url = URL(string: post.profileImageURL) 
     let data = try? Data(contentsOf: url!) 
    profileImage.image = UIImage(data: data!) 
    contentPostLabel.text = "\(post.content)" 

    if post.mediaType == "image" 
    { 
    let url1 = URL(string: post.contentURL) 
    let data1 = try? Data(contentsOf: url1!) 
    let image = UIImage(data: data1!) 
    let imageToView = UIImageView(image: image!) 
    imageToView.frame = CGRect(x: 0, y: 0, width: 375 , height: 250) 
    imageToView.contentMode = UIViewContentMode.scaleToFill 
    contentTypeView.addSubview(imageToView) 


    } 
    else if post.mediaType == "null" 
    { 
     print("Status") 
    } 
    else if post.mediaType == "video" 
    { 
     print("Video") 
    } 
    else if post.mediaType == "youtube" 
    { 
    print("youtube") 
    } 
} 

} 
+1

に減少させることができます。単に 'let'キーワードを使用してください。 – vadian

+0

@keshu Raiはテーブル関数内でコールしていますか?そしてその時に配列にデータがありますか?ブレークポイントを使用し、コードをデバッグします。 –

+0

実際には値は配列に格納されていません。私はviewdidの配列の配列にprint関数を呼び出して、空のエラーを表示しました..コードを調べて、エラーを確認してください。私は非常に長いこのコードで立ち往生しているので、それは多くの助けを喚起してください。 –

答えて

0

は、ほとんどの場合、問題が発生します。

まずスウィフト3では、JSON辞書は[String:Any]です。第2に、私のコメントで既に述べたように、プライベートバッキング変数はSwiftではナンセンスです。

クラスPostDataは別に*の発行プライベートバッキング変数から*ビーイング定数をふりすると、スウィフトにばかげている

class PostData { 
    let profileImageURL : String 
    let fullName : String 
    let location : String 
    let title : String 
    let postTime : String 
    let likes : Int 
    let comments : Int 
    let mediaType : String 
    let contentURL : String 
    let content : String 
    let plocation : String 


    init(postDict : [String:Any]) 
    {   
     fullName = postDict["full_name"] as? String ?? "" 
     profileImageURL = postDict["profile_pic"] as? String ?? "" 
     location = postDict["user_city"] as? String ?? "" 
     title = postDict["title"] as? String ?? "" 
     postTime = postDict["order_by_date"] as? String ?? "" 
     likes = postDict["liked_count"] as? Int ?? 0 
     comments = postDict["comment_count"] as? Int ?? 0 
     mediaType = postDict["media_path"] as? String ?? "" 
     contentURL = postDict["media_path"] as? String ?? "" 
     content = postDict["content"] as? String ?? "" 
     plocation = postDict["location"] as? String ?? "" 
    } 
} 
+0

おいしかったよ...今、私は細胞のデータをたくさんありがとうございました...しかし、私はビュー内を通過した画像を取得していません。私のPostDataTableViewCellコードのconfigureCell()関数で。それに対する解決策はありますか? –

+0

基本的にデータを同期して読み込むのは悪いです。モデルにimageプロパティを追加し、キャッシングシステムを使用する必要があります。あなたのコードでは、ユーザがスクロールすると画像が何度も再読み込みされます。また、文字列には '' \() "'を使用しないでください。それは冗長です。 – vadian

+0

actully mちょうどもっと新鮮な..学習段階のm .. wudは確かに私のコードを改善する:) thanks –

関連する問題