2017-01-03 40 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時,每次添加新對象時,您的數組都不會重新初始化。
希望這可能會幫助你,並可能解決你的問題。