简体   繁体   中英

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 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM