列表未从其他视图填充

时间:2014-08-11 01:37:48

标签: ios objective-c

我有一个视图控制器,用户可以在其中填充项目。退出视图时,应保存对象,并由包含所有这些对象列表的上一个视图加载。我的NSLog显示该对象正在保存,但我无法将其显示在列表视图中。

两个控制器的代码如下。感谢

列表控制器

#import "ItemsViewController.h"
#import "Calculation.h"
#import "CalculationItemStore.h"
#import "CalculationDetailViewController.h"

@interface ItemsViewController()
@property UISegmentedControl *segment;

@end

@implementation ItemsViewController

- (instancetype)init
{
    // Call the superclass's designated initializer
    self = [super initWithStyle:UITableViewStylePlain];
    if (self) {

        UINavigationItem *navItem = self.navigationItem;
        navItem.title = @"MACS";

        // Create a new bar button item that will send
        // addNewItem: to CalculationsViewController
        UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                             target:self
                                                                             action:@selector(addNewItem:)];


        // Set this bar button item as the right item in the navigationItem
        navItem.rightBarButtonItem = bbi;

        navItem.leftBarButtonItem = self.editButtonItem;

    }
    return self;
}

- (instancetype)initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

- (void)viewDidLoad
{
    self.segment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Publication", @"About", nil]];
    self.tableView.tableHeaderView = _segment;
    [_segment addTarget:self action:@selector(segmentPressed:) forControlEvents:UIControlEventValueChanged];


    [self.tableView registerClass:[UITableViewCell class]
           forCellReuseIdentifier:@"UITableViewCell"];
}

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

    [self.tableView reloadData];
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get a new or recycled cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];

    // Set the text on the cell with the description of the item
    // that is at the nth index of items, where n = row this cell
    // will appear in on the tableview
    NSArray *items = [[CalculationItemStore sharedStore] allCalculations];
    Calculation *item = items[indexPath.row];

    cell.textLabel.text = item.title;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    CalculationDetailViewController *detailViewController = [[CalculationDetailViewController alloc] init];

    NSArray *items = [[CalculationItemStore sharedStore] allCalculations];
    Calculation *selectedItem = items[indexPath.row];

    // Give detail view controller a pointer to the item object in row
    detailViewController.calculation = selectedItem;

    // Push it onto the top of the navigation controller's stack
    [self.navigationController pushViewController:detailViewController
                                         animated:YES];
}

- (void)   tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // If the table view is asking to commit a delete command...
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSArray *items = [[CalculationItemStore sharedStore] allCalculations];
        Calculation *item = items[indexPath.row];
        [[CalculationItemStore sharedStore] removeItem:item];

        // Also remove that row from the table view with an animation
        [tableView deleteRowsAtIndexPaths:@[indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
    }
}

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

- (void)segmentPressed:(id)sender {

    if (_segment.selectedSegmentIndex ==0) {

     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://ferm.forestry.oregonstate.edu/facstaff/leshchinsky-ben"]];

    }else if(_segment.selectedSegmentIndex ==1){

        UIImageView *imageView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, 320, 480)];
        imageView.backgroundColor = [UIColor redColor];
        [imageView setImage: [UIImage imageNamed:@"MACSLoad@2x.png"]];
        [self.view addSubview: imageView];
        sleep(5);
        imageView.hidden = YES;

    }


}

- (IBAction)addNewItem:(id)sender
{
    // Create a new Calculation and add it to the store
    Calculation *newItem = [[CalculationItemStore sharedStore] createCalculation];

    CalculationDetailViewController *detailViewController = [[CalculationDetailViewController alloc]initForNewItem:YES];
    detailViewController.calculation = newItem;

    detailViewController.dismissBlock = ^{
        [self.tableView reloadData];
    };

    UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:detailViewController];
    navController.modalPresentationStyle = UIModalPresentationFullScreen;
  //  [self presentViewController:navController animated:YES completion:NULL];
    [self.navigationController pushViewController:detailViewController animated:YES];
}

@end

项目控制器保存方法

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

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

    //save changes
    BOOL success = [[CalculationItemStore sharedStore]saveChanges];
    if(success){
        NSLog(@"Saved all calcs");

    }else{
        NSLog(@"failure saving");
    }
}

1 个答案:

答案 0 :(得分:1)

我认为问题在于,在第一个控制器上调用表reloadData时,第二个控制器没有完成加载。一旦第二个VC完成保存,您可以通知第一个VC重新加载数据。可以使用

通知它
  1. 在第二个或

  2. 上创建一个委托
  3. 使用通知

  4. 如果您需要有关如何执行此操作的详细信息,请与我们联系!

    看起来对象创建也存在问题。 您的计算元素未正确创建。当你准备保存时..查看self.privateItems的内容。他们填写的价值是零。您需要正确实例化字符串。

    engineerName也需要分配和其他字符串。 当用户点击完成时,需要将文本框中的值设置为您的数据模型。