Xcode 4.2 - потеря объектов массива - PullRequest
0 голосов
/ 25 января 2012

Я новичок в Xcode 4.2 и у меня есть вопрос о массиве раскадровки.Я делаю учебник под названием DrinkMixer, но кодирую его с помощью Storyboard вместо традиционного подхода XIB.

В этом приложении используется контроллер навигации, табличное представление (MasterViewController), которое перемещается в подробное представление (DetailViewController), ирежим добавления напитка (AddDrinkViewController) представлен модально.

Представление таблицы (выбор напитка из таблицы) и подробное представление (показывает детали выбранного напитка) прекрасно работает.Но когда я пытаюсь добавить новый напиток и нажимаю кнопку «Сохранить», модальное представление исчезает правильно, но табличное представление не обновляется новым напитком.

Я создал ссылку на свой drinkArrayв MasterViewController и подумал, что будет поддерживать мой массив, когда я размещаю новый напиток с помощью addObject, но я где-то скучаю по лодке.Точки останова в MasterViewController показывают, что у меня изначально есть 40 объектов в моем drinkArray, но когда я попадаю в AddDrinkViewController, в drinkArray есть 0 объектов.

Кто-нибудь знает, почему мой drinkArray теряет свои объекты?Заранее благодарен за любой совет!

Вот мой код ...

MasterViewController.h

#import <UIKit/UIKit.h>
@interface MasterViewController : UITableViewController {
    NSMutableArray *drinks;
}
@property (nonatomic, retain) NSMutableArray *drinks;
@end

MasterViewController.m

#import "MasterViewController.h"
#import "DetailViewController.h"
#import "AddDrinkViewController.h"
#import "DrinkConstants.h"

@implementation MasterViewController
@synthesize drinks;
@synthesize masterUIView;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"DrinkDirections" ofType:@"plist"];
    drinks = [[NSMutableArray alloc] initWithContentsOfFile:path];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView reloadData];
}
.
.
.
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"SegueAddDrink"]) {
        AddDrinkViewController *addViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"AddDrink"];
        addViewController.drinkArray = self.drinks;
    }
}

AddDrinkViewController.h

#import <UIKit/UIKit.h>
@interface AddDrinkViewController : UIViewController {
    BOOL           keyboardVisible;
    NSMutableArray *drinkArray_;
}

- (void)keyboardDidShow:(NSNotification *)notif;
- (void)keyboardDidHide:(NSNotification *)notif;

@property (nonatomic, retain) NSMutableArray *drinkArray;
@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UITextField  *nameTextField;
@property (nonatomic, retain) IBOutlet UITextView   *ingredientsTextView;
@property (nonatomic, retain) IBOutlet UITextView   *directionsTextView;

- (IBAction) save: (id) sender;
- (IBAction) cancel: (id) sender;
@end

AddDrinkViewController.m

#import "MasterViewController.h"
#import "AddDrinkViewController.h"
#import "DrinkConstants.h"

@implementation AddDrinkViewController
@synthesize drinkArray = drinkArray_;
@synthesize scrollView;
@synthesize nameTextField;
@synthesize ingredientsTextView;
@synthesize directionsTextView;
.
.
.
- (IBAction) save: (id) sender {
    // Create a new drink dictionary for the new values.
    NSMutableDictionary *newDrink = [[NSMutableDictionary alloc] init];
    [newDrink setValue:self.nameTextField.text forKey:NAME_KEY];
    [newDrink setValue:self.ingredientsTextView.text forKey:INGREDIENTS_KEY];
    [newDrink setValue:self.directionsTextView.text forKey:DIRECTIONS_KEY];

    [drinkArray_ addObject:newDrink];

    // Remove the modal view and go back to the table view.
    [self dismissModalViewControllerAnimated:YES];
}

1 Ответ

1 голос
/ 25 января 2012

Я думаю, проблема здесь:

 AddDrinkViewController *addViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"AddDrink"];

Вам не нужно создавать новый экземпляр контроллера представления.Это будет обработано автоматически.Поэтому я думаю, что контроллер View, который вы видите, не тот, которому вы назначаете массив.Попробуйте вместо этого:

AddDrinkViewController* addViewController = (AddDrinkViewController*) segue.destinationViewController;
addViewController.drinkArray = self.drinks;
...