【问题标题】:nskeyedarchiver doesn't work on ios8 but works on ios7 and simulatornskeyedarchiver 不适用于 ios8,但适用于 ios7 和模拟器
【发布时间】:2014-09-29 15:22:02
【问题描述】:

所以我将NSKeyedArchiver 用作愿望清单,它在 iOS 7 和模拟器上完美运行,但在 iOS 8 设备上却不行。

这里是我正在使用的代码:

wishlist.m

- (void)viewDidLoad
{
    NSString *voirexpo = @"viensdeexpo";
    [[NSUserDefaults standardUserDefaults] setObject:voirexpo forKey:@"voirexpo"];
    [[NSUserDefaults standardUserDefaults] synchronize];


    [super viewDidLoad];

    self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;
    refait=0;
    refait2=0;
    wishlist * car2=[NSKeyedUnarchiver unarchiveObjectWithFile:@"myWishlist1.bin"];
    NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    NSData * objectData = [defaults objectForKey:@"myWishlist1.bin"];
    if(objectData != nil)
    {
        wishlist * car3 = [NSKeyedUnarchiver
                               unarchiveObjectWithData:objectData];
        NSLog(@"YOOOOOOUUUUHOOOOO   %@", [car3 description]);

    }
    NSLog(@"YOOOOOOUUUUHOOOOO   %@", [car2 description]);


    rent=@"0";

    self.navigationItem.backBarButtonItem =
    [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                     style:UIBarButtonItemStyleBordered
                                    target:nil
                                    action:nil];

}

-(NSString*)pathForCacheFile:(NSString*)fileName
{

    NSArray*documentDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,    NSUserDomainMask, YES);
    NSString*path = nil;
    if (documentDir) 
    {
        path = [documentDir objectAtIndex:0];
    }
    return [NSString stringWithFormat:@"%@/%@", path, fileName];
}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    if(_dataSource)
    {
        _dataSource=nil;
    }


    _dataSource=[NSKeyedUnarchiver unarchiveObjectWithFile:[self pathForCacheFile:@"myWishlist1.bin"]];

    tableview.scrollEnabled=YES;

    [tableview reloadData];

} 

cardescription.m(我选择要放入愿望清单的汽车的视图)

-(NSString*)pathForCacheFile:(NSString*)fileName
{

    NSArray*    documentDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString*   path = nil;

    if (documentDir) 
    {
        path = [documentDir objectAtIndex:0];
    }

    return [NSString stringWithFormat:@"%@/%@", path, fileName];
}

static wishlist *mywishlist;
-(void)saveInWishlist
{
    if(mywishlist)
        mywishlist=nil;
    mywishlist=[wishlist new];

    mywishlist.exponom=wishexpo;
    mywishlist.idvoiture=TelephoneCellulaire;
    mywishlist.imvoiture=dataimage;
    mywishlist.objid=objectId;

    {
        NSMutableArray *temp=[NSKeyedUnarchiver unarchiveObjectWithFile:[self pathForCacheFile:@"myWishlist1.bin"]];


        //        mywishlist.imageSrc=filePath;

        if(temp.count==0 || temp==nil)
        {
            NSMutableArray*newArr=[NSMutableArray array];

            [newArr addObject:mywishlist];

            [NSKeyedArchiver archiveRootObject:newArr toFile:[self pathForCacheFile:@"myWishlist1.bin"]];
            NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
            // userObject is the object we want to save...
            [defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:newArr] forKey:@"myWishlist1.bin"];
            [defaults synchronize];

        }
        else
        {
            [temp addObject:mywishlist];
            [NSKeyedArchiver archiveRootObject:temp toFile:[self pathForCacheFile:@"myWishlist1.bin"]];
            NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
            // userObject is the object we want to save...
            [defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:temp] forKey:@"myWishlist1.bin"];
            [defaults synchronize];
        }
    }
}

- (IBAction)BACKO:(id)sender {

    [self saveInWishlist];

    NSLog(@"ICIII %@",wishexpo);

    wishlist * car2=[[wishlist alloc]init];
    car2.exponom=wishexpo;
    car2.idvoiture=TelephoneFix;
    car2.imvoiture=dataimage;
    car2.objid=objectId;
    [NSKeyedArchiver archiveRootObject:car2 toFile:@"
"];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Wishlist"
                                                    message:@"This car has been successfully added to your wishlist"
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];

}

-(NSString*)pathForCacheFile1:(NSString*)fileName
{

    NSArray*documentDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString*path = nil;
    if (documentDir) 
    {
        path = [documentDir objectAtIndex:0];
    }
    return [NSString stringWithFormat:@"%@/%@", path, fileName];
}

【问题讨论】:

  • 您遇到了什么错误/具体问题?
  • 这是我每次得到的错误:-[NSFileManager fileSystemRepresentationWithPath:]: nil or empty path argument'
  • 您找到解决方案了吗?
  • 不,我使用了 NSUserDefaults 并在其中保存了一个数组。然后我得到值并将它们放入 NSDictionary
  • 好的,我会尝试做同样的事情。谢谢

标签: ios objective-c ios7 ios8 nskeyedarchiver


【解决方案1】:

我在使用NSKeyedArchiver 时遇到了同样的错误,而且只是从 iOS8 开始。就我而言,我正在这样做:

[defaultManager changeCurrentDirectoryPath:customDirectory];
[NSKeyedArchiver archiveRootObject:blankDictionary toFile:filename];

但是当我这样做时它起作用了:

NSString fullPath = [NSString stringWithFormat:@"%@/%@", customDirectory, filename];
[NSKeyedArchiver archiveRootObject:blankDictionary toFile:fullPath];

我的猜测是NSKeyedArchiver 中有一个错误,并且相对路径名不起作用。如果您的搜索路径中有相对路径名,请尝试将其删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2013-10-07
    相关资源
    最近更新 更多