草庐IT

ios - 我无法快速将数组写入 NSUserDefaults

coder 2023-09-09 原文

<分区>

我试图通过添加一个对象数组而不只是一个对象来写入 NSUserDefaults。

但是,我得到了这个错误

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
"MyNotificaiton",
"MyNotificaiton"
) for key pushArray'

我很确定这意味着我尝试插入的数组类型不正确,但我不知道我需要用它做什么来修复它。

这是我目前的情况

class PushNotificationController: UIViewController {


let arrayKey : String = "pushArray"


var defualtUrl : String = ""
var defualtMessage : String = ""
var defualtTitle : String = ""
var defualtCoupon : String = ""
var storedUrl : String = ""
var storedMessage : String = ""
var storedTitle : String = ""
var storedCoupon : String = ""

var urlVar : String = ""
var messageVar : String = ""
var titleVar : String = ""
var couponVar : String = ""


var myNote : MyNotificaiton?

let loginInformation = NSUserDefaults.standardUserDefaults()
let noteificationDefaults = NSUserDefaults.standardUserDefaults()

var recivedNotification = [MyNotificaiton]()

@IBOutlet weak var titleLable: UILabel!
@IBOutlet weak var messageLable: UILabel!
@IBOutlet weak var urlLable: UILabel!
@IBOutlet weak var couponLable: UILabel!


override func viewDidLoad() {
    super.viewDidLoad()
    //add observer for load request in webview when receive remote notification.
    NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(PushNotificationController.PushReceiver(_:)), name: "PushReceived", object: nil)

    var isThereAMessage : Bool = false

    //create an array
    //Fill it with the userdefulat data
    //Check to see if there is any writen data
    //othere wise just move along
    if noteificationDefaults.objectForKey(arrayKey) != nil
    {
        recivedNotification = loadPushArray()
        print("Loading push Array")
        print(recivedNotification.count)
    }


    //Get the Url from the push notification
    if loginInformation.objectForKey("URL") != nil
    {
        storedUrl = loginInformation.objectForKey("URL") as! String
        if storedUrl.isEmpty
        {urlLable.text = "Url is Empty"
        }else{
             urlLable.text = storedUrl
             urlVar = storedUrl
        }
    }else
    {urlLable.text  = "Url is Empty"}
    //Display the Push notification

    //Set the message variable
    if loginInformation.objectForKey("Message") != nil
    {
        storedMessage = loginInformation.objectForKey("Message") as! String

        if storedMessage.isEmpty
        {messageLable.text  = "Message is Empty"
        }
        else{
            messageLable.text = storedMessage
            messageVar = storedMessage
            isThereAMessage = true
        }
    }else{messageLable.text = "Message is Empty"}

    //Set the Title variable
    if loginInformation.objectForKey("Title") != nil
    {
        storedTitle = loginInformation.objectForKey("Title") as! String

        if storedTitle.isEmpty
        {titleLable.text = "Title is Empty"}
        else{
            titleLable.text = storedTitle
            titleVar = storedTitle
        }
    }else{titleLable.text = "Title is Empty"}

    //Set the Title variable
    if loginInformation.objectForKey("Coupon") != nil
    {
        storedCoupon = loginInformation.objectForKey("Coupon") as! String

        if storedCoupon.isEmpty
        {couponLable.text = "Coupon is Empty"
        }else{
            couponLable.text = storedCoupon
            couponVar = storedCoupon
        }
    }else
    {couponLable.text = "Title is Empty"}

    //Saved the recived data to the push notifcation items

    print("Check to see if I recived a message : ")
    print(isThereAMessage)


    //Test to see if there was a push notificaiton sent
    if(isThereAMessage)
    {
        //if there was then create a new object with the data recived
        myNote = MyNotificaiton(pUrl: urlVar,pMessage: messageVar,pTitle: titleVar,pCoupon: couponVar)
        recivedNotification.insert(myNote!, atIndex: 0)
        recivedNotification.insert(recivedNotification[0], atIndex: 1)

        print("Added item to Recived Note Array")
        printPushObject(myNote!)
        print(recivedNotification.count)
        print("Printing the Array")
        printPushObject(recivedNotification[0])
        print("Printed the Array")
        //Save the array now
        savePushArray(recivedNotification)
    }

}

func clearLoginInfo()
{
    //set everything back to empty so it can recive new notification
    loginInformation.setObject(defualtUrl, forKey: "URL")
    loginInformation.setObject(defualtMessage, forKey: "Message")
    loginInformation.setObject(defualtTitle, forKey: "Title")
    loginInformation.setObject(defualtCoupon, forKey: "Coupon")
    self.loginInformation.synchronize()
}


//Save the Modified Arrays
func savePushArray(myArray : [MyNotificaiton])
{
    noteificationDefaults.setObject(myArray, forKey: arrayKey)
    noteificationDefaults.synchronize()
}
//Load the array
func loadPushArray() -> [MyNotificaiton]
{
    let array : [MyNotificaiton] = noteificationDefaults.objectForKey(arrayKey) as! [MyNotificaiton]
    return array
}

//When post notification then below method is called.
func PushReceiver(notifi: NSNotification)
{
    print("Pushed Recieved")
    //let dicNotifi: [NSObject : AnyObject] = notifi.userInfo!
    //NSLog("notificiation Info %@ \n", dicNotifi)
}

//Printing of an object
//This is a tail of Cpt Jack Sparrow
func printPushObject(myObject : MyNotificaiton)
{
    print(myObject.title)
    print(myObject.message)
    print(myObject.url)
    print(myObject.coupon)
}

//Build the object

//MARK: MYNotification class
class MyNotificaiton
{
    var url : String?
    var message : String?
    var title : String?
    var coupon : String?

    init(pUrl : String, pMessage : String, pTitle : String, pCoupon : String)
    {
        url = pUrl
        message = pMessage
        title = pTitle
        coupon = pCoupon
    }
    //Save and load data from NSUserDefaults
    init(coder aDecoder : NSCoder!)
    {
        self.url = aDecoder.decodeObjectForKey("thisUrl") as? String
        self.message = aDecoder.decodeObjectForKey("thisMessage") as? String
        self.title = aDecoder.decodeObjectForKey("thisTitle") as? String
        self.coupon = aDecoder.decodeObjectForKey("thisCoupon") as? String
    }

    func initWithCoder(aDecoder : NSCoder) -> MyNotificaiton
    {
        self.url = aDecoder.decodeObjectForKey("thisUrl") as? String
        self.message = aDecoder.decodeObjectForKey("thisMessage") as? String
        self.title = aDecoder.decodeObjectForKey("thisTitle") as? String
        self.coupon = aDecoder.decodeObjectForKey("thisCoupon") as? String

        return self
    }

    func encodeWithCoder(aCoder : NSCoder!)
    {
        aCoder.encodeObject(url, forKey: "thisUrl")
        aCoder.encodeObject(message, forKey: "thisMessage")
        aCoder.encodeObject(title, forKey: "thisTitle")
        aCoder.encodeObject(coupon, forKey: "thisCoupon")
    }

}

有关ios - 我无法快速将数组写入 NSUserDefaults的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐