Save TableView Data

I do make tableview save and load data. I have 2 warning and 2 error.

Errors:

Incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'NSString *__strong'
Implicit conversion of 'BOOL' (aka 'signed char') to 'id' is disallowed with ARC
Incompatible integer to pointer conversion sending 'BOOL' (aka 'signed char') to parameter of type 'id'

Where is my wrong? And How do I fix?

Task.h

#import <Foundation/Foundation.h>

@interface Task : NSObject

@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) BOOL done;

-(id)initWithName:(NSString *)name done:(BOOL)done;

@end

Task.m

#import "Task.h"

@implementation Task

@synthesize name = _name;
@synthesize done = _done;

-(id)initWithName:(NSString *)name done:(BOOL)done {
    self = [super init];

    if (self) {
        self.name = name;
        self.done = done;
    }
    return self;
}

My Save and Load Code

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    NSLog(@"Entering Background");
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // paths[0];
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
    //NSArray  *keys = [[NSArray alloc] initWithObjects:@"task", nil];
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSEnumerator *enumerator = [_tasks objectEnumerator];
    Task *tempTodo;
    while ( tempTodo = [enumerator nextObject])
    {
        [array addObject:tempTodo.name];
        [array addObject:tempTodo.done]; //Eror is here..
    }
    [array writeToFile:plistPath atomically:YES];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tasks = [[NSMutableArray alloc] init];

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:app];


    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // paths[0];
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
    if ([fileManager fileExistsAtPath:plistPath] == YES)
    {
        NSMutableArray *readArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
        _tasks = [[NSMutableArray alloc] init];
        NSEnumerator *enumerator = [readArray objectEnumerator];
        NSString *str = [[NSString alloc] init];
        while ( str = [enumerator nextObject])
        {
            Task *tempTodo = [[Task alloc] init];
            tempTodo.name = str;
            str = [enumerator nextObject];
            tempTodo.done = str;  //Error and warning is here.
            [_tasks addObject:tempTodo]; 

        }
        [[self tableView] reloadData];
    }

}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"AddTaskSegue"]) {
        UINavigationController *navCon = segue.destinationViewController;

        AddTaskViewController *addTaskViewController = [navCon.viewControllers objectAtIndex:0];
        addTaskViewController.taskListViewController = self;
    } else if ([segue.identifier isEqualToString:@"EditDoneTaskSegue"] || [segue.identifier isEqualToString:@"EditNotDoneTaskSegue"]) {
        EditTaskViewController *edit =segue.destinationViewController;
        edit.task = [self.tasks objectAtIndex:self.tableView.indexPathForSelectedRow.row];

    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *NotDoneCellIdentifier = @"NotDoneTaskCell";
    static NSString *DoneCellIdentifier = @"DoneTaskCell";

    Task *currentTask = [self.tasks objectAtIndex:indexPath.row];

    NSString *cellIdentifier = currentTask.done ? DoneCellIdentifier : NotDoneCellIdentifier;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    cell.textLabel.text = currentTask.name;

    return cell;
}

Instead of @property (nonatomic,assign) BOOL done;

use

@property BOOL done;

Also,

    NSString *str = [[NSString alloc] init];
    while ( str = [enumerator nextObject])
    {
        Task *tempTodo = [[Task alloc] init];
        tempTodo.name = str;
        str = [enumerator nextObject];
        tempTodo.done = str;  //Error and warning is here.

Here str is string and you assigning it to BOOL .

And

while ( tempTodo = [enumerator nextObject])
{
    [array addObject:tempTodo.name];
    [array addObject:tempTodo.done]; //Eror is here..
}

NSArray can contain objects only while tempTodo.done is BOOL which is a primitive type signed char

You can box that thing to string or number as

[array addObject:@(tempTodo.done)]; //NSNumber
链接地址: http://www.djcxy.com/p/44912.html

上一篇: 将const T * const转换为T *

下一篇: 保存TableView数据