在View Controller中创建全局对象数组

时间:2017-01-03 05:25:09

标签: ios objective-c uitableview nsmutablearray

我正在创建一个简单的ToDo应用程序来学习Objective-C语言。初始视图是Tableview控制器,单元格显示不同的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]];
}

请注意,在swift版本中,数组是在viewDidLoad之上创建的。 这允许我在整个View Controller中使用该数组。

请注意,在Objective-C版本中,数组已在viewDidLoad中创建并填充。这是一个问题,因为当我添加一个新的Todo对象,然后调用[self.tableView reloadData];来更新视图时,它会调用viewDidLoad方法并重新进入数组。结果,就像我从未在第一个地方添加新的ToDo对象一样(因为数组被重新初始化并由Todo对象初始化器重新填充(请参阅下面我添加到数组中的方法)。 / p>

以下行添加到_arrayOfTodos

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

我想知道如何创建一个ToDo个对象的数组,在视图加载之前(或者我可以在Controller中全局使用它的其他地方)。

这是我的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 个答案:

答案 0 :(得分: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类,会更好。

答案 1 :(得分:0)

正如您在上述问题中所解释的那样

  

下面的行添加到_arrayOfTodos。

     

[_ arrayOfTodos addObject:[[Todo alloc] initWithInformation:@“Fly Back   到SF“todoDeadline:@”8/6/17“todoStatus:inProgress”];

你将挑战初始阵列。因为您通过初始化TODO来初始化数组。相反,当您初始化数组对象并使用它可以将对象添加到数组时,您可以为TODO创建一个comen对象,例如:

- (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对象时,每次添加新对象时,您的数组都不会重新初始化。
希望这可以帮助您并解决您的问题。