Swift3 TableView在未捕获异常下崩溃';NSUnknownKeyException';,此类不符合密钥x和x27的键值编码;

Swift3 TableView在未捕获异常下崩溃';NSUnknownKeyException';,此类不符合密钥x和x27的键值编码;,swift3,tableview,Swift3,Tableview,我似乎无法使用自定义单元格使此tableView正常工作。我得到一个运行时错误 由于未捕获异常“NSUnknownKeyException”而终止应用程序, 原因:'[setValue:forUndefinedKey:]:此类不是键 与密钥CauseCompaignDescription兼容的值编码。' 奇怪的是,这个属性不再被这样命名了。这是单元格文件MainViewControllerTableViewCell // // MainViewControllerTableViewCell.s

我似乎无法使用自定义单元格使此tableView正常工作。我得到一个运行时错误

由于未捕获异常“NSUnknownKeyException”而终止应用程序, 原因:'[setValue:forUndefinedKey:]:此类不是键 与密钥CauseCompaignDescription兼容的值编码。'

奇怪的是,这个属性不再被这样命名了。这是单元格文件MainViewControllerTableViewCell

//
//  MainViewControllerTableViewCell.swift
// 
//
//  Created by on 9/13/17.
//  Copyright © 201. All rights reserved.
//

import UIKit

class MainViewControllerTableViewCell: UITableViewCell {


    @IBOutlet weak var causeCampaignImageView: UIImageView!



    @IBOutlet weak var causeDescription: UILabel!


    @IBOutlet weak var daysToFinishLabel: UILabel!


    @IBOutlet weak var raisedOverTotalLabel: UILabel!


    @IBOutlet weak var percentageCompletedLabel: UILabel!

    @IBOutlet weak var goalProgresView: UIProgressView!


    //card used on
    @IBInspectable var cornerradius : CGFloat = 2

    @IBInspectable var shadowOffSetWidth : CGFloat = 0

    @IBInspectable var shadowOffSetHeight : CGFloat = 5

    @IBInspectable var shadowColor : UIColor = UIColor.black

    @IBInspectable var shadowOpacity : CGFloat = 0.5



    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    override func layoutSubviews() {
        layer.cornerRadius = cornerradius
        layer.shadowColor = shadowColor.cgColor
        layer.shadowOffset = CGSize(width: shadowOffSetWidth, height: shadowOffSetHeight)
        let shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: cornerradius)
        layer.shadowPath = shadowPath.cgPath
        layer.shadowOpacity = Float(shadowOpacity)
    }


}
这是保存表视图的视图控制器MainViewController

//
//  ViewController.swift
// 
//
//  Created by on 1/28/17.
//  Copyright © 2017. All rights reserved.
//

import UIKit
import Alamofire
import SwiftyJSON
import Firebase


class MainViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    var campaignRowsData  = [CauseCampaign]()

    var serverFetchCampaignsUrl = Config.Global._serverUrl



    @IBOutlet weak var campaignTableView: UITableView!


    //show navigation controller bar

    var facebookID = "", twitterID = "",firebaseID = ""


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //hide bar from navigation controller

        setToolbar()

        campaignTableView.delegate=self

        campaignTableView.dataSource=self

        campaignTableView.separatorColor = UIColor(white: 0.95, alpha: 1)

        recoverUserDefaults()

        getCampaignList()



        //print(facebookID, twitterID, firebaseID)

    }


    func setToolbar(){
        //hide bar from navigation controller
        self.navigationController?.isNavigationBarHidden = false

        self.navigationItem.setHidesBackButton(true, animated: false)

        self.navigationController?.navigationBar.barTintColor = UIColor.purple



    }

    func getCampaignList(){

        Alamofire.request(serverFetchCampaignsUrl+"/campaigns/get/all/user/\(twitterID)/firebase/\(firebaseID)/cat/0", method: .get).validate().responseJSON { response in
            switch response.result {
            case .success(let data):


                let campaignCausesJSON = JSON(campaignCausesData: data)

                self.parseCampaignCausesListResponse(campaignCausesJSON)

                //alternative thread operation


                DispatchQueue.main.async {
                    self.campaignTableView.reloadData()

                }

            case .failure(let error):
                print(error)
            }
        }

    }

    func parseCampaignCausesListResponse(_ campaignCausesJSON:JSON){

        if let activeCampaignCount = campaignCausesJSON["active_campaigns_count"].string {
            //Now you got your value
            print("TOTAL_ACTIVE_CAMPAIGNS",activeCampaignCount)
            CampaignsGlobalDataManagerUtil.campaignTotalCount = Int(activeCampaignCount)!
        }

        if let contributorUserId = campaignCausesJSON["contributor_user_id"].string {
            //Now you got your value
            print("CONTRIBUTOR_USER_ID",contributorUserId)
            CurrentUserUtil.contributorUserId = contributorUserId
        }

        if let userTwitterFollowersQty = campaignCausesJSON["user_twitter_followers_qty"].int {
            //Now you got your value
            print("USER_TWITTER_FOLLOWERS_QTY",userTwitterFollowersQty)
            CurrentUserUtil.twitterFollowersCount = Int(userTwitterFollowersQty)
        }

        //Parsing campaigns object array

          campaignCausesJSON["camp_array"].arrayValue.map({

            let campaignCause:JSON = $0

             parseCampaign(campaignCause)
          })




    }
    //TODO:CHANGE TO DATATAPE OBJECT
    func parseCampaign(_ causeCampaign:JSON){

        let causeCampaignObject: CauseCampaign = CauseCampaign();

        causeCampaignObject.description = causeCampaign["cause_description"].stringValue


        causeCampaignObject.id = causeCampaign["campaign_id"].stringValue


        if let contributorsQty = causeCampaign["contributors_qty"].int{
            causeCampaignObject.contributorsQty = contributorsQty

        }

        causeCampaignObject.currencySymbol = causeCampaign["currency_symbol"].stringValue

        if let currentContributions = causeCampaign["current_contributions"].float{
            causeCampaignObject.currentContributions = currentContributions

        }

        if let goal = causeCampaign["goal"].float {
            causeCampaignObject.goal = goal
        }

        if let goalPercentageAchieved = causeCampaign["goal_percentage_achieved"].float{
            causeCampaignObject.goalPercentageAchieved = causeCampaign["goal_percentage_achieved"].float!
        }

        causeCampaignObject.hashtag = causeCampaign["hashtag"].stringValue

        causeCampaignObject.name = causeCampaign["name"].stringValue

        if let remainingAmmountToGoal = causeCampaign["remaining_ammount_to_goal"].float{
            causeCampaignObject.remainingAmmountToGoal = remainingAmmountToGoal
        }

        if let picUrl =  causeCampaign["pic_url"].stringValue as? String {
            causeCampaignObject.picUrl = picUrl
        }

        if let campaignStartingDate = causeCampaign["created_at"].string{
            causeCampaignObject.campaignStartingDate = campaignStartingDate
        }

        if let campaignEndingDate = causeCampaign["campaign_ending_date"].string{
            causeCampaignObject.campaignEndingDate = campaignEndingDate

        }


        var foundationsArray = [Foundation]()

        causeCampaign["foundations"].arrayValue.map({

            let id = $0["foundation_id"].stringValue
            let twitterUsername = $0["twitter_username"].stringValue
            let picPath = $0["pic_path"].stringValue
            let name = $0["name"].stringValue

            let foundation:Foundation = Foundation(id,twitterAccount: twitterUsername,picPath: picPath,name: name)

            foundationsArray.append(foundation)
        })


        causeCampaignObject.foundations = foundationsArray


        campaignRowsData.append(causeCampaignObject)

//        foundations = "<null>";

//innecesario
//        SACAR DE LA REQUEST INICIAL???
//        "went_inactive_date" = "<null>";
//        "tweet_id" = 900936910494810112;


    }




    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return campaignRowsData.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       let cell = campaignTableView.dequeueReusableCell(withIdentifier: "campaignCell", for: indexPath) as! MainViewControllerTableViewCell

    //setting card attributes
        print("ROW",campaignRowsData[indexPath.row].description)
        let campaignCause:CauseCampaign = campaignRowsData[indexPath.row]

        if let desc = campaignCause.description as? String{
                cell.causeDescription.text = desc
        } else {
            print("NULL")
        }

        return cell
    }


    func recoverUserDefaults(){
        if let fbID = UserDefaults.standard.object(forKey: Config.Global._facebookIdUserDefaults) as? String {
            facebookID = fbID
        }else{
            print("FACEBOOK ID IS NULL")
        }



        if let twtID = UserDefaults.standard.object(forKey: Config.Global._twitterIdUserDefaults) as? String{
            twitterID = twtID
        }else{
            print("TWITTER ID IS NULL")
        }


        if  let firID = UserDefaults.standard.object(forKey: Config.Global._firebaseIdUserDefaults) as? String{
            firebaseID = firID
        }else{
            print("TWITTER ID IS NULL")
        }

        return
    }



}
//
//ViewController.swift
// 
//
//创建于2017年1月28日。
//版权所有©2017。版权所有。
//
导入UIKit
进口阿拉莫菲尔
导入快捷JSON
进口火基
类MainViewController:UIViewController、UITableViewDelegate、UITableViewDataSource{
var活动RowsData=[CauseCompaign]()
var serverfetchactivationsurl=Config.Global.\u serverUrl
@ibtableview:UITableView!
//显示导航控制器栏
var facebookID=“”、twitterID=“”、firebaseID=“”
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后,通常从nib执行任何其他设置。
//从导航控制器隐藏栏
setToolbar()
ActivityTableView.delegate=self
ActivityTableView.dataSource=self
ActivityTableView.separatorColor=UIColor(白色:0.95,alpha:1)
recoverUserDefaults()
getCampaignList()
//打印(facebookID、twitterID、firebaseID)
}
func setToolbar(){
//从导航控制器隐藏栏
self.navigationController?.isNavigationBarHidden=false
self.navigationItem.setHidesBackButton(true,动画:false)
self.navigationController?.navigationBar.barTintColor=UIColor.purple
}
func getCampaignList(){
Alamofire.request(serverFetchCampaignsUrl+“/campaigns/get/all/user/\(twitterID)/firebase/\(firebaseID)/cat/0”,方法:.get.validate().responseJSON{response in
开关响应。结果{
案例.成功(让数据):
让活动原因JSON=JSON(活动原因数据:数据)
self.parseCampaignCausesListResponse(活动原因JSON)
//交替线程操作
DispatchQueue.main.async{
self.activatableview.reloadData()
}
案例。失败(let错误):
打印(错误)
}
}
}
func parseCampaignCausesListResponse(campaignCausesJSON:JSON){
如果让activeCampaignCount=campaignCausesJSON[“active\u campaigns\u count”]。字符串{
//现在你得到了你的价值
打印(“活动总数”,活动活动计数)
ActivationsGlobalDataManagerUtil.ActivationTotalCount=Int(ActiveActivationCount)!
}
如果让contributorUserId=campaignCausesJSON[“contributor\u user\u id”]。字符串{
//现在你得到了你的价值
打印(“贡献者用户ID”,贡献者用户ID)
CurrentUserUtil.contributorUserId=contributorUserId
}
如果让userTwitterFollowersQty=ActivationCausesJSON[“用户\推特\追随者\数量”].int{
//现在你得到了你的价值
打印(“用户\推特\追随者\数量”,用户TWITTER追随者数量)
CurrentUserUtil.twitterFollowersCount=Int(userTwitterFollowersQty)
}
//分析活动对象数组
活动原因JSON[“营地数组”].arrayValue.map({
让活动原因:JSON=$0
宣传活动(宣传事业)
})
}
//TODO:更改为数据磁带对象
func parseCampaign(uuCauseCompaign:JSON){
让CauseCompaignObject:CauseCompaign=CauseCompaign();
CauseCompaignObject.description=CauseCompaign[“原因描述”].stringValue
CauseCompaignObject.id=CauseCompaign[“活动id”].stringValue
如果让参与者数量=原因比较[“参与者数量”].int{
CauseCompaignObject.contributorsQty=contributorsQty
}
CauseCompaignObject.currencySymbol=CauseCompaign[“货币符号”].stringValue
如果让currentContributions=CauseCompaign[“current_contributions”]。浮动{
CauseCompaignObject.currentContributions=currentContributions
}
如果让目标=CauseCompaign[“目标”]。浮动{
CauseCompaignObject.goal=目标
}
如果让GoalPercentageAcheved=CauseCompaign[“目标百分比”]。浮动{
CauseCompaignObject.GoalPercentageAcheved=CauseCompaign[“目标\完成百分比”]。浮动!
}
CauseCompaignObject.hashtag=CauseCompaign[“hashtag”].stringValue
CauseCompaignObject.name=CauseCompaign[“name”].stringValue
如果让Remainingamounttogal=CauseCompaign[“剩余弹药到目标”]。浮动{
CauseCompaignObject.remainingamounttogal=remainingamounttogal
}
如果让picUrl=causeCompaign[“pic_url”].stringValue作为?字符串{
CauseCompaignObject.picUrl=picUrl
}
如果让ActivationStartingDate=CauseCompaign[“在”]创建。字符串{
CauseCompaignObject.ActivationStartingDate=活动开始日期
}
如果让campaignEndingDate=CauseCompaign[“campaign\u ending\u date”]。字符串{
CauseCompaignObject.campaignEndingDate=活动结束日期
}
var foundationsArray=[Foundation]()
CauseCompaign[“foundations”].arrayValue.map({
let id=$0[“foundation_id”].stringValue
让twitterUsername=$0[“twitter_username”].stringValue
设picPath=$0[“PICU路径”].stringValue
让name=$0[“name”].stringValue
让foundation:foundation=foundation(id,twitterAccount:twitterUsername,picPath:p
find /path/to/your/project/directory -name .git -prune -or -type f -exec grep causeCampaignDescription {} \; -print