NSMutableArray в AppDelegate addObject от IBAction - PullRequest
1 голос
/ 03 января 2011

Я пытался добавить в приложение простую закладку для своей диссертации в универе. Я новичок в разработке для iPhone, поэтому на самом деле я не понимаю, что происходит.

То, что я пытаюсь сделать, это добавить объект (строку) в массив, но то, что я сделал, вообще не работает.

Я установил свой массив в AppDelegate, и он заполняет табличное представление в файле BookmarksViewController.m.

Мое приложение состоит из панели вкладок и панели навигации, но я выделил все это здесь, чтобы его было легче читать.

Вот код:

НАСТРОЙКА Массива

DissertationAppDelegate.h

#import <UIKit/UIKit.h>

@class DissertationViewController;

@interface DissertationAppDelegate : NSObject <UIApplicationDelegate> {

    NSMutableArray *array;

    UIWindow *window;
    DissertationViewController *viewController;
}

@property (nonatomic, retain) UIWindow *window;

@property (nonatomic, retain) NSMutableArray *array;

@end

DissertationAppDelegate.m

#import "DissertationAppDelegate.h"

@implementation DissertationAppDelegate

@synthesize window;

@synthesize array;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) launchOptions {    

    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *fullFileName = [NSString stringWithFormat:@"%@/arraySaveFile", documentsDirectory];

    array = [[NSMutableArray alloc] init];
    [array addObject:@"One"];
    [array addObject:@"Two"];
    [array addObject:@"Three"];


    [array writeToFile:fullFileName atomically:NO];

    [self.window makeKeyAndVisible];
}

НАСЕЛЕНИЕ ВИДА НА СТОЛ С МАССОЙ

BookmarksViewController.h

@interface BookmarksViewController : UITableViewController {
    NSMutableArray *bookmarksArray;
}

@property (nonatomic, retain) NSMutableArray *bookmarksArray;

BookmarksViewController.m

#import "BookmarksViewController.h"
@synthesize bookmarksArray;
- (void)viewDidLoad {

    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *fullFileName = [NSString stringWithFormat:@"%@/arraySaveFile", documentsDirectory];
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName];

    bookmarksArray = array;


[self.tableView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    return [bookmarksArray 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] autorelease];
    }

    // Configure the cell...


      cell.textLabel.text = [bookmarksArray objectAtIndex:indexPath.row];
    return cell;
}

- (void)dealloc {
    [bookmarksArray release];
    [super dealloc];
}

ВЫПОЛНЕНИЕ ИБАКЦИИ ОТ ДРУГОГО КОНТРОЛЛЕРА ВИДА

Заголовочный файл

-(IBAction) pushChap01Bookmark:(id)sender;

Файл реализации

-(IBAction) pushChap01Bookmark:(id)sender{

    DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.array = [[NSMutableArray alloc] init];
    [appDelegate.array addObject:@"THIS IS WHAT I WANT TO ADD"];

    [self.navigationController pushViewController:bookmarksViewController animated:YES];
    bookmarksViewController.title = @"Bookmarks";

}

Okkkkkkkkk .... Поэтому, когда вы нажимаете кнопку, я хотел добавить ее в массив в делегате приложения и поместить BookmarksViewController в стек навигации и обновить таблицу. Делает все, кроме добавления объекта в массив.

Если есть кто-нибудь, кто знает, что случилось, тогда, пожалуйста, помогите мне. Я буду очень благодарен.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 мая 2013

В pushChap01Bookmark вы делаете это:

appDelegate.array = [[NSMutableArray alloc] init];

, который воссоздает массив в appDelegate (таким образом, он снова имеет 0 элементов).Вместо этого делайте это только в том случае, если он равен nil:

DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
if(appDelegate.array == nil) {
    appDelegate.array = [[NSMutableArray alloc] init];
}
[appDelegate.array addObject:@"THIS IS WHAT I WANT TO ADD"];
//here save that appDelegate.array to file
[appDelegate saveArray];

Также создайте новый метод saveArray (вы можете использовать его снова в другом месте), чтобы сохранить этот массив в файл:

- (void)saveArray {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *fullFileName = [NSString stringWithFormat:@"%@/arraySaveFile", documentsDirectory];
    [self.array writeToFile:fullFileName atomically:NO];
}
0 голосов
/ 03 января 2011

Вы понимаете, что создаете новый объект массива каждый раз, когда вызывается IBAction, сохраняя его дважды, даже не освобождая его?

Это создаст утечку памяти, но, что более важно, она заменитцелый массив с новым (никогда не освобождая старый) каждый раз, когда вы просто хотите что-то добавить.Таким образом, вы на самом деле не добавляете что-то, а создаете массив, содержащий один объект.

Метод действия - это плохое место для инициализации чего-то вроде вашего массива.Переместите код инициализации в метод applicationDidFinishLaunching или в другое разумное место и не забудьте освободить его после того, как вы присвоите его свойству с помощью (сохраняющего) метода доступа.

Редактировать: Вы фактически делаете инициализацию в applicationDidFinishLaunching, однако вы не присваиваете результирующий массив своему свойству appdelegates, чтобы он был потерян.Присвойте его своей собственности и удалите присвоение в вашем IBAction, это должно помочь.

Edit2: Опять-таки плохо, вы фактически присваиваете массив своему ivar, не используя аксессорхоть.Если первые несколько элементов вашего массива отображаются правильно и они остаются в табличном представлении после того, как вы нажали кнопку, то ваш IBAction, вероятно, не вызывается или ваше табличное представление не перезагружается.Ваш код должен фактически удалить все записи, заменив их только одной новой записью.Поместите NSLog в свой IBAction, чтобы проверить, вызывается ли он, если нет, проверить ваши соединения.Если это так, проверьте, действительно ли перезагружается представление таблицы.

Edit3 (в ответ на ваш комментарий): Попробуйте добавить следующую строку в IBAction сразу после добавления новой строки ..:

NSLog(@"The array contains %i objects.", [[appDelegate array] count]);

Это должно вывести на консоль, сколько объектов содержится в вашем массиве - если он есть, и если число увеличивается при каждом нажатии кнопки, то что-то не так с вашей таблицей, перезагружающей данные.Я подозреваю, что способ, которым вы «транспортируете» данные в свой bookmarksviewcontroller, может быть причиной вашей проблемы - вы загружаете содержимое массивов appdelegates с диска только в пределах viewdidload в ваш массив закладок.Если viewdidload больше не вызывается, то данные в массиве закладок также не обновляются.Попробуйте перечитать файл в viewWillAppear (или каком-либо другом методе, который будет вызван до перезагрузки табличного представления).Я настоятельно рекомендую вам найти другой способ хранения ваших данных - ваш подход подвержен всевозможным ошибкам.Попробуйте вместо этого войти в NSUserdefaults или Core Data.Однако в целях тестирования попробуйте заменить эту строку

cell.textLabel.text = [bookmarksArray objectAtIndex:indexPath.row];

вашего кода cellForRow ... следующим кодом:

DissertationAppDelegate *appDelegate = (DissertationAppDelegate *)[[UIApplication sharedApplication] delegate];
[[cell textLabel] setText:[[appDelegate array] objectAtIndex:indexPath.row]];

Дайте мне знать, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...