0

私は簡単なチェックリストアプリを書いています。2 つの UIViewController があります。1 つ目は、チェックリストを UITableView に表示します。UIBarButtonItem を使用して 2 番目のビューをスタックにプッシュし、新しいタスクを追加しています。すべてのタスクは配列に保存されます。

1 つのことを除けば、すべてがうまく機能します。

編集モードに入ってテーブル ビューから項目を削除すると、テーブル ビューと配列から項目が削除されます。この部分は正常に動作しているようです。ただし、アイテムを削除した後、バー ボタンのアイテムをタップして新しいタスクを追加すると、問題が発生します。

私の NSLogs は、新しい項目が配列に追加されたことを教えてくれますが、テーブル ビューに戻ると、新しい項目の代わりに削除された項目が表示されます。テーブル ビューは、デキューされたセルを再利用しているようです (不明)。

私は何を間違っていますか?

CLCheckListViewController.m

#import "CLCheckListViewController.h"
#import "CLTaskFactory.h"
#import "CLTaskStore.h"
#import "CLAddTaskViewController.h"

@implementation CLCheckListViewController
{
    __weak IBOutlet UITableView *checkList;
}

- (id)init
{
    self = [super init];
    if (self) {
        // add five sample tasks
        CLTaskFactory *task1 = [[CLTaskFactory alloc] init];
        [task1 setTaskName:@"Task 1"];
        [task1 setDidComplete:NO];
        [[CLTaskStore sharedStore] addTask:task1];

        CLTaskFactory *task2 = [[CLTaskFactory alloc] init];
        [task2 setTaskName:@"Task 2"];
        [task2 setDidComplete:NO];
        [[CLTaskStore sharedStore] addTask:task2];

        CLTaskFactory *task3 = [[CLTaskFactory alloc] init];
        [task3 setTaskName:@"Task 3"];
        [task3 setDidComplete:NO];
        [[CLTaskStore sharedStore] addTask:task3];

        CLTaskFactory *task4 = [[CLTaskFactory alloc] init];
        [task4 setTaskName:@"Task 4"];
        [task4 setDidComplete:NO];
        [[CLTaskStore sharedStore] addTask:task4];

        CLTaskFactory *task5 = [[CLTaskFactory alloc] init];
        [task5 setTaskName:@"Task 5"];
        [task5 setDidComplete:NO];
        [[CLTaskStore sharedStore] addTask:task5];
    }
    return self;
}

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    // create edit button
    [[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];

    // create title
    [[self navigationItem] setTitle:@"Checklist"];

    // create add guest button
    UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(pushAddTask)];
    [[self navigationItem] setRightBarButtonItem:bbi];
}

- (void)pushAddTask
{
    CLAddTaskViewController *advk = [[CLAddTaskViewController alloc] init];
    [[self navigationController] pushViewController:advk animated:YES];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[CLTaskStore sharedStore] allTasks] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [checkList dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        // put the tasks into the cell
        [[cell textLabel] setText:[NSString stringWithFormat:@"%@", [[[CLTaskStore sharedStore] allTasks] objectAtIndex:[indexPath row]]]];

        // put the checkbox into the cell's accessory view
        UIButton *checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
        checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
        [checkBox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
        [checkBox setImage:[UIImage imageNamed:@"checkbox-checked.png"] forState:UIControlStateSelected];
        checkBox.frame = CGRectMake(0, 0, 30, 30);
        checkBox.userInteractionEnabled = YES;
        [checkBox addTarget:self action:@selector(didCheckTask:) forControlEvents:UIControlEventTouchDown];
        cell.accessoryView = checkBox;
    }
    return cell;
}

- (void)didCheckTask:(UIButton *)button
{
    CGPoint hitPoint = [button convertPoint:CGPointZero toView:checkList];
    hitIndex = [checkList indexPathForRowAtPoint:hitPoint];

    task = [[[CLTaskStore sharedStore] allTasks] objectAtIndex:[hitIndex row]];

    if (task.didComplete) {
        task.didComplete = NO;
    } else {
        task.didComplete = YES;
    }

    NSInteger taskCount = [[[CLTaskStore sharedStore] allTasks] count];
    for (int i = 0; i < taskCount; i++) {
        NSLog(@"%@, status: %@", [[[CLTaskStore sharedStore] allTasks] objectAtIndex:i], [[[[CLTaskStore sharedStore] allTasks] objectAtIndex:i] didComplete]?@"YES":@"NO");
    }

    // toggle checkbox
    button.selected = !button.selected;
}

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

    // set editing mode
    if (editing) {
        self.navigationItem.title = @"Edit Checklist";
        [checkList setEditing:YES];
    } else {
        self.navigationItem.title = @"Checklist";
        [checkList setEditing:NO];
    }
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
                                            forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // remove task
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        // remove task from CLTaskStore
        task = [[[CLTaskStore sharedStore] allTasks] objectAtIndex:[indexPath row]];
        [[CLTaskStore sharedStore] removeTask:task];

        // remove guest from table view
        [checkList deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        // reload table view
        //[checkList reloadData];
    }
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    [[CLTaskStore sharedStore] moveTaskAtIndex:[sourceIndexPath row] toIndex:[destinationIndexPath row]];
}

@end

CLAddTaskViewController.m

#import "CLAddTaskViewController.h"
#import "CLTaskFactory.h"
#import "CLTaskStore.h"

@implementation CLAddTaskViewController

    - (void)viewDidLoad
    {
        [[self navigationItem] setTitle:@"Add Task"];
    }

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

        // clear first responder
        [[self view] endEditing:YES];

        // create new task
        CLTaskFactory *newTask = [[CLTaskFactory alloc] init];
        [newTask setTaskName:[newTaskName text]];

        // add new guest to RCGuestStore
        [[CLTaskStore sharedStore] addTask:newTask];
    }

    @end

CLAddTaskFactory.m

#import "CLTaskFactory.h"

@implementation CLTaskFactory

@synthesize taskName;

- (void)setDidComplete:(BOOL)dc
{
    didComplete = dc;
}

- (BOOL)didComplete
{
    return didComplete;
}

- (NSString *)description
{
    // override the description
    NSString *descriptionString = [[NSString alloc] initWithFormat:@"%@", taskName];
    return descriptionString;
}

@end

CLAddTaskStore.m

#import "CLTaskStore.h"
#import "CLTaskFactory.h"
#import "CLCheckListViewController.h"

@implementation CLTaskStore

+ (id)allocWithZone:(NSZone *)zone
{
    return [self sharedStore];
}

+ (CLTaskStore *)sharedStore
{
    static CLTaskStore *sharedStore = nil;
    if (!sharedStore) {
        sharedStore = [[super allocWithZone:nil] init];
    }
    return sharedStore;
}

- (id)init
{
    self = [super init];
    if (self) {
        allTasks = [[NSMutableArray alloc] init];
    }
    return self;
}

- (NSMutableArray *)allTasks
{
    return allTasks;
}

- (void)addTask:(CLTaskFactory *)task
{
    [allTasks addObject:task];
    NSLog(@"Task added: %@", task);
}

- (void)removeTask:(CLTaskFactory *)task
{
    // remove the item for the deleted row from the store
    [allTasks removeObjectIdenticalTo:task];

    NSInteger taskCount = [allTasks count];
    NSLog(@"Removed: %@, there are now %d remaining tasks, they are:", task, taskCount);
    for (int i = 0; i < taskCount; i++) {
        NSLog(@"%@, status: %@", [[[CLTaskStore sharedStore] allTasks] objectAtIndex:i], [[[[CLTaskStore sharedStore] allTasks] objectAtIndex:i] didComplete]?@"YES":@"NO");
    }
}

- (void)moveTaskAtIndex:(int)from toIndex:(int)to
{
    if (from == to) {
        return;
    }

    CLTaskFactory *task = [allTasks objectAtIndex:from];
    [allTasks removeObjectAtIndex:from];
    [allTasks insertObject:task atIndex:to];
}

@end

ご協力いただきありがとうございます!

4

2 に答える 2

1

ダレンは正しいです。ここでコードを見ると:

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    // put the tasks into the cell
    [[cell textLabel] setText:[NSString stringWithFormat:@"%@", [[[CLTaskStore sharedStore] allTasks] objectAtIndex:[indexPath row]]]];

    // put the checkbox into the cell's accessory view
    UIButton *checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
    checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
    [checkBox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
    [checkBox setImage:[UIImage imageNamed:@"checkbox-checked.png"] forState:UIControlStateSelected];
    checkBox.frame = CGRectMake(0, 0, 30, 30);
    checkBox.userInteractionEnabled = YES;
    [checkBox addTarget:self action:@selector(didCheckTask:) forControlEvents:UIControlEventTouchDown];
    cell.accessoryView = checkBox;
}

あなたの唯一のセルの設定if(cell == nil) コードを次のように変更します

if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// put the tasks into the cell
[[cell textLabel] setText:[NSString stringWithFormat:@"%@", [[[CLTaskStore sharedStore] allTasks] objectAtIndex:[indexPath row]]]];

// put the checkbox into the cell's accessory view
UIButton *checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
checkBox = [UIButton buttonWithType:UIButtonTypeCustom];
[checkBox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
[checkBox setImage:[UIImage imageNamed:@"checkbox-checked.png"] forState:UIControlStateSelected];
checkBox.frame = CGRectMake(0, 0, 30, 30);
checkBox.userInteractionEnabled = YES;
[checkBox addTarget:self action:@selector(didCheckTask:) forControlEvents:UIControlEventTouchDown];
cell.accessoryView = checkBox;
于 2012-05-11T03:44:35.940 に答える