2017-01-03 3 views
0

Я создаю простое приложение ToDo для изучения языка Objective-C. Первоначальное представление представляет собой Tableview Controller, и ячейки отображают разные файлы Todo.Создание глобального массива объектов в контроллере представления

Вот мой код в Swift Язык:

var toDos:[ToDo]=[ 
    ToDo(taskTitle: "Feed the dog", taskDeadline: "11/23/2016", finishedState: .finished), 
    ToDo(taskTitle: "Eat Food", taskDeadline: "12/23/2016", finishedState: .notFinished), 
    ToDo(taskTitle: "Clean Up Room", taskDeadline: "10/13/2016", finishedState: .finished) 
] 

// MARK: ViewDidLoad 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

Вот мой код Objective-C

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _arrayOfTodos = [[NSMutableArray alloc]init]; 
    [_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Fly Back to SF" todoDeadline:@"8/6/17" todoStatus:inProgress]]; 
    [_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Wash Clothes" todoDeadline:@"4/11/17" todoStatus:inProgress]]; 
    [_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Read Books" todoDeadline:@"5/11/17" todoStatus:unfinished]]; 
    [_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Cook Pasta" todoDeadline:@"3/9/17" todoStatus:finished]]; 
    [_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Feed Dog" todoDeadline:@"1/1/17" todoStatus:finished]]; 
} 

Обратите внимание, как в быстрой версии, массив создается над viewDidLoad. Это позволяет мне использовать этот массив во всем этом View Controller.

Уведомление в версии Objective-C, массив создается и заполняется в viewDidLoad. Это создает проблему, потому что когда я добавляю новый объект Todo, а затем вызываю [self.tableView reloadData];, чтобы обновить представление, он вызывает метод viewDidLoad, и он повторно вводит массив. В результате, как я никогда не добавлял новый объект ToDo (потому что массив повторно инициализируется и повторно заполняется инициализаторами объекта Todo (см. Как я добавляю к массиву ниже).

линия ниже добавляет в _arrayOfTodos.

[_arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Fly Back to SF" todoDeadline:@"8/6/17" todoStatus:inProgress]];

Я хотел бы знать, как создать массив ToDo объектов ВЫШЕ зрения был нагрузка (или где-нибудь еще я могу использовать его глобально в контроллере).

Это мой MainVC.h

#import <UIKit/UIKit.h> 
#import "Todo.h" 

@class Todo; 

@interface MainVC : UITableViewController 
-(void)addNewTodo:(Todo *)todo; 
@property (strong, nonatomic) NSMutableArray *arrayOfTodos; 
@end 
+2

'[self.tableView reloadData]' не вызывает 'viewDidLoad'. 'viewDidLoad' вызывается только один раз, поэтому это не должно быть проблемой –

+0

, почему он проходит через его методы и создает другой массив? @Vishnugondlekar –

+0

Было бы лучше использовать Singleton. См. Здесь: https://xcodenoobies.blogspot.my/2012/08/how-to-pass-data-between.html – GeneCode

ответ

0

Вы можете взять этот массив в AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate> { 
} 
@property (strong, nonatomic) NSMutableArray *arrayOfTodos; 

И вы можете получить к нему доступ в любом месте в проекте с помощью этого:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
[delegate.arrayOfTodos addObject: [[Todo alloc]initWithInformation:@"Fly Back to SF" todoDeadline:@"8/6/17" todoStatus:inProgress]]; 

Было бы лучше, если вы создаете Global класс для все такие глобальные данные и функции.

+0

Я не думаю, что я должен создавать переменные в делегате приложения. Как воспроизвести быструю версию? В быстрой версии я мог бы просто создать массив объектов и использовать его в контроллере представления. нет ли эквивалента Objective-C? –

+0

См. Сначала Вы должны решить, хотите ли вы получить к нему доступ с использованием объекта MainVC или объекта Some Global class? –

+0

, если вы хотите получить к нему доступ с помощью объекта MainVC, поэтому вам нужно взять его в Appdelagate. Поскольку вы уже создали свойство @property (сильный, неатомный) NSMutableArray * arrayOfTodos; поэтому вы можете получить доступ в любом месте проекта, но с использованием объекта MainVC только MainVC * obj; obj.arrayOfTodos вот так. Сначала вы очищаете то, что хотите, я дам вам решение с кодом –

0

Как пояснил в вашем выше вопросе по

В строке ниже добавляет к в _arrayOfTodos.

[_arrayOfTodos addObject: [[Todo alloc] initWithИнформация: @ "Fly Back to SF" todoDeadline: @ "8/6/17" todoStatus: inProgress]];

Вы вызывающе получите начальный массив. Поскольку вы инициализируете свой массив, инициализируя TODO. Скорее всего вы можете сделать comen объект вашей TODO один раз, когда вы инициализации вашего объекта массива и с помощью этого вы можете добавить свой объект в массиве, некоторые, что нравится:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _arrayOfTodos = [[NSMutableArray alloc]init]; 
    _todo = [[Todo alloc] init]; 
    [_arrayOfTodos addObject: [_todo initWithInformation:@"Fly Back to SF" todoDeadline:@"8/6/17" todoStatus:inProgress]]; 
    [_arrayOfTodos addObject: [_todo initWithInformation:@"Wash Clothes" todoDeadline:@"4/11/17" todoStatus:inProgress]]; 
    [_arrayOfTodos addObject: [_todo initWithInformation:@"Read Books" todoDeadline:@"5/11/17" todoStatus:unfinished]]; 
    [_arrayOfTodos addObject: [_todo initWithInformation:@"Cook Pasta" todoDeadline:@"3/9/17" todoStatus:finished]]; 
    [_arrayOfTodos addObject: [_todo initWithInformation:@"Feed Dog" todoDeadline:@"1/1/17" todoStatus:finished]]; 
} 

Над _todo является глобально объявлен объект, который вам может объявить объект массива.
Когда вы используете этот объявленный глобально объект TODO, ваш массив не будет повторно инициализироваться при каждом добавлении нового объекта.
Надеюсь, это поможет вам и может решить вашу проблему.

Смежные вопросы