initWithCoder:方法无法正确打印到屏幕

时间:2014-07-23 16:52:20

标签: ios objective-c uitableview

我遇到了initWithCoder:方法的问题。在读取行

item.text = [NSString stringWithFormat:@"Item for %@", list.name];

“项目为”不会打印到屏幕上。 list.name印刷得很好。

有什么问题?

#import "AllListsViewController.h"
#import "Checklist.h"
#import "ChecklistViewController.h"
#import "ChecklistItem.h"

@interface AllListsViewController ()

@end

@implementation AllListsViewController
{
    NSMutableArray *_lists;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super initWithCoder:aDecoder])) {
        _lists = [[NSMutableArray alloc] initWithCapacity:20];

        Checklist *list;

        list = [[Checklist alloc] init];
        list.name = @"Birthdays";
        [_lists addObject:list];

        list = [[Checklist alloc] init];
        list.name = @"Groceries";
        [_lists addObject:list];

        list = [[Checklist alloc] init];
        list.name = @"Cool Apps";
        [_lists addObject:list];

        list = [[Checklist alloc] init];
        list.name = @"To Do";
        [_lists addObject:list];

        for(Checklist *list in _lists) {
            ChecklistItem *item = [[ChecklistItem alloc] init];
            item.text = [NSString stringWithFormat:@"Item for %@", list.name];
            [list.items addObject:item];
        }

    }
    return self;

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source


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


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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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


    Checklist *checklist = _lists[indexPath.row];
    cell.textLabel.text = checklist.name;
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Checklist *checklist = _lists[indexPath.row];

    [self performSegueWithIdentifier:@"ShowChecklist" sender:checklist];
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_lists removeObjectAtIndex:indexPath.row];

    NSArray *indexPaths = @[indexPath];
    [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if  ([segue.identifier isEqualToString:@"ShowChecklist"])
    {
        ChecklistViewController *controller = segue.destinationViewController;

        controller.checklist = sender;
    }
    else if ([segue.identifier isEqualToString:@"AddChecklist"]) {
        UINavigationController *navigationController = segue.destinationViewController;

        ListDetailViewController *controller = (ListDetailViewController *)navigationController.topViewController;
        controller.delegate = self;
        controller.checklistToEdit = nil;

    }
}

#pragma mark - ListDetailViewControllerDelegate methods

- (void)listDetailViewControllerDidCancel:(ListDetailViewController *)controller
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)listDetailViewController:(ListDetailViewController *)controller didFinishAddingChecklist:(Checklist *)checklist
{
    NSInteger newRowIndex = [_lists count];
    [_lists addObject:checklist];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:newRowIndex inSection:0];

    NSArray *indexPaths = @[indexPath];
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)listDetailViewController:(ListDetailViewController *)controller didFinishEditingChecklist:(Checklist *)checklist
{
    NSInteger index = [_lists indexOfObject:checklist];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.textLabel.text = checklist.name;

    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:@"ListNavigationController"];

    ListDetailViewController *controller = (ListDetailViewController *)navigationController.topViewController;
    controller.delegate = self;
    Checklist *checklist = _lists[indexPath.row];
    controller.checklistToEdit = checklist;
    [self presentViewController:navigationController animated:YES completion:nil];
}


@end

1 个答案:

答案 0 :(得分:0)

如果您希望在单元格中显示带有Item for ...的字符串,则表示您没有显示正确的对象。目前,从我所看到的,您的数据结构如下所示:

_lists (Array):
[
    list (Checklist):
    {
        name (String): @"Birthdays", // 0
        items (Array):
        [
            item (ChecklistItem):
            {
                text (String): @"Item for Birthdays" // 1
            }
        ]
    },
    list (Checklist):
        etc.

]

您似乎正在将您的手机textLabel设置为_lists[indexPath.row].name,我在上面的结构中// 0对此进行了评论。如果您想要转到Item for ...(注释为// 1)字符串,您需要执行以下操作:

_lists[indexPath.row].items[0].text

我假设它将在索引0处,除非您恰好将其他数据添加到我认为是NSMutableArray *itemsChecklistItem对象的内容。