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