2015-12-21 51 views
1

我的应用程序了崩溃,并在标题中提到的例外。请在下面找到我的解释:错误:replaceObjectAtIndex:withObject:]:突变方法发送到不可变对象

试图在我的TableViewController使用NSUserDefaults的数组的值存储为下:

func didDismissContentViewController(controller:ContentViewController,pageIndex:Int) { //You're passed in the contentViewController here, use relevant data to update your model. NSLog("Inside delegate method ..\n") var currentIdx = pageIndex 

    NSLog("Value of index edited \(pageIndex)") 
    NSLog("Current edited value is : \(controller.myTextView.text)") 

    **pageContent.replaceObjectAtIndex(pageIndex, withObject: controller.myTextView.text)** 

**//pageCotent is defined as an NSMutableArray only...** 

    NSUserDefaults.standardUserDefaults().setObject(pageContent as NSMutableArray, forKey: "PageValues") 
    NSUserDefaults.standardUserDefaults().synchronize() 
} 
Retrieval is done as under : if var storedPageContent = NSUserDefaults.standardUserDefaults().objectForKey("PageValues") as? NSMutableArray{ pageContent = storedPageContent 

虽然我能够存储,检索和在各自的页面中显示更新后的页面值,随后过渡来回之间的tableviewcontroller和内容视图控制器抛出下面的错误:

015-12-21 00:51:46.592 PageApp[3943:203948] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object' * First throw call stack: 

我试过店里注释掉到NSUserDefault,并且应用程序了不死机,而使用NSU serDefault存储值,导致这种情况发生,所以当我将它存储在NSUserDefaults中时出现错误,然后检索它并将其分配给数组。

任何帮助,这个可以理解。 Exchange data between uitah

回答

1

我认为这个问题是,即使你是一个NSMutableArray分配从NSUserDefaults检索到的值,它实际上并没有创造一个NSMutableArray如你预期。你可以尝试初始化一个新的NSMutableArray与从NSUserDefaults获取的对象? 在Objective-C,就会像

NSMutableArray *pageContent = [[NSMutableArray alloc] initWithObjects:object1,nil]; 

其中object1是从NSUserDefaults取出的值。对不起,我不知道Swift

1

NSUserDefaults返回的数组是不可变的,所以您需要制作数组的可变副本,然后在您修改它之后重新设置数组NSUserDefaults

我不知道斯威夫特不够好,给你的代码示例,但是这是如何会在Objective-C来完成:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefauts]; 
NSMutableArray *pageContent = [[userDefaults objectForKey:@"PageValues"] mutableCopy]; 
[pageContent replaceObjectAtIndex:pageIndex withObject:controller.myTextView.text]; 
[userDefaults setObject:pageContent forKey:@"PageValues"]; 
1

我昨天碰到了一模一样的问题。显然,如果你使用NSUserDefaults得到一个数组对象,它就像是一个NSArray,即使你指定它为NSMutableArray。

所以我解决了这个问题的方式用这种方式(Objective-C的)了。一旦我将它传递给另一个NSMutableArray,我就可以从中添加/删除对象。

NSArray *favArrayTemp = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyFavServers"]; 
NSMutableArray favArray = [[NSMutableArray alloc] initWithArray:favArrayTemp]; 
1

使用Swift本机类型。

演员类型从NSUserDefaults检索到本地雨燕集合类型为var那么它是可变的。

var pageContent = [String]() 
... 

let userDefaults = NSUserDefaults.standardUserDefauts() 
pageContent = userDefaults["PageValues"] as! [String] 

替换也很容易。

pageContent[pageIndex] = controller.myTextView.text 

边注:强制而来自NSUserDefaults读取值展开假定键/值对已正确注册。然后展开是安全的。

0

谢谢你的回应。我按照您的建议进行了更改,并且工作正常。让我下面分享:

//正如你提到的,由于NSUserDefault总是期望的NS阵列,我做存储为下:

的NSLog(“我是bactktomonths .. \ n内部”)

//定义一个NS阵列到可变数组复制到不可变阵列 变种storedArray = NSArray的()

storedArray  = pageArray! 

    NSUserDefaults.standardUserDefaults().setObject(storedArray , forKey: "PageValues") 
    NSUserDefaults.standardUserDefaults().synchronize() 
} 

//检索。

如果(NSUserDefaults.standardUserDefaults()。objectForKey( “PageValues”)!=无){

 pageContent = NSUserDefaults.standardUserDefaults().objectForKey("PageValues")?.mutableCopy() as NSMutableArray 

//我不知道如果我需要执行下面的代码,但我已经离开它如建议,它目前正常工作! NSUserDefaults.standardUserDefaults()的setObject(pageContent,forKey: “PageValues”)。

由于

相关问题