2017-01-03 44 views
0

我正在创建一个简单的ToDo应用程序来学习Objective-C语言。初始视图是Tableview控制器,单元格显示不同的Todo's。在视图控制器中创建全局对象阵列

这是我在斯威夫特语言代码:

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() 
} 

这里是我的目标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上面创建的代码。 这使我可以在整个视图控制器中使用该数组。

注意在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

我不认为我应该在应用程序委托中创建变量。我如何复制swift版本?在swift版本中,我可以制作一组对象并在View Controller中使用它。没有Objective - C的等价物吗? –

+0

请先查看您必须决定是否要使用MainVC对象或某个全局类对象访问它? –

+0

如果你想使用MainVC对象访问它,所以你需要把它放在Appdelagate中。正如你已经创建@property的属性(强,非原子)的NSMutableArray * arrayOfTodos;这样你就可以在每一个地方访问项目,但使用MainVC对象只MainVC * OBJ; obj.arrayOfTodos是这样的。首先,你清楚你想我会为您提供代码解决方案是什么 –

0

正如你已经在你上面的问题由

解释了线下增加了的_arrayOfTodos。

[_arrayOfTodos ADDOBJECT:[[待办事项的alloc] initWithInformation:@ “飞回到 到SF” todoDeadline:@ “17年8月6日” 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时,每次添加新对象时,您的数组都不会重新初始化。
希望这可能会帮助你,并可能解决你的问题。