2012-01-24 3 views
0

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

Это приложение использует навигационный контроллер, табличный вид (MasterViewController), который подталкивается к подробному представлению (DetailViewController) и представлению add-drink (AddDrinkViewController), представленному в моделях.

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

Я создал ссылку на мой drinkArray в MasterViewController и подумал, что будет поддерживать мой массив, когда я положу новый напиток с помощью addObject, но где-то я пропускаю лодку. Точки останова в MasterViewController показывают, что у меня изначально было 40 объектов в моем напиткеArray, но когда я добираюсь до 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 

AddDrinkViewCont roller.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

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

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

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

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

Это был билет! Прекрасно работает. Спасибо SOOOOOO много !!! – JimVision