-(IBAction)addToArray{
arrayTestAppDelegate *object = [[arrayTestAppDelegate alloc] init];
[object addToArray3];
}
Приведенный выше код неверен. Вы не должны alloc
'делегировать приложение внутри контроллера представления. Мол, никогда. Когда-либо. (Кроме того, вы теряете память каждый раз, так как вы не связали свой alloc
/ init
с release
. Но я отвлекся ...)
Если вы хотите получить доступ к делегату приложения с ваших контроллеров представления, вы делаете это так:
arrayTestAppDelegate* delegate = (arrayTestAppDelegate*)[[UIApplication sharedApplication] delegate];
[delegate addToArray];
Пока это отвечает на ваш вопрос, я настоятельно призываю вас не использовать делегат приложения в качестве держателя для глобальных переменных. Хотя создание массивов верхнего уровня и т. Д. В делегате приложения не так уж и плохо, вы должны передавать эти объекты по иерархии контроллера представления при создании каждого контроллера представления. Это чище в том смысле, что у вас нет действий, происходящих на расстоянии. (Долой одиночек!)
(P.S. В Какао принято, что имена классов начинаются с заглавных букв - arrayTestAppDelegate
следует переименовать ArrayTestAppDelegate
)
Edit:
Как бы это исправить, учитывая, что я изменяю его, чтобы инициализировать массив в RootViewController и вызывать функцию из SecondViewController?
Во-первых, объект, которому принадлежит объект, вероятно, должен отвечать за инициализацию объекта. Не помещайте свой массив в делегат приложения, а затем инициализируйте его в другом месте. Это еще одна форма «действия на расстоянии», которую потом трудно прочитать и отладить.
Во-вторых, для ответа на ваш вопрос действительно требуется больше информации о том, как ваши "RootViewController
" и "SecondViewController
" существуют в иерархии вашего контроллера. Но я могу дать вам общий ответ о передаче объектов (например, вашего массива) вдоль линии.
(я предполагаю, что ваш RootViewController
является контроллером представления верхнего уровня в вашем приложении, а SecondViewController
является контроллером представления, показанным RootViewController
. Судя по названиям, это безопасная ставка.)
ArrayTestAppDelegate.h (обратите внимание на заглавные буквы) может выглядеть примерно так:
...
@interface ArrayTestAppDelegate : NSObject <UIApplicationDelegate>
{
...
@private
NSMutableArray* theArray;
...
}
...
Обратите внимание на отсутствие @property
.
ArrayTestAppDelegate.m может выглядеть примерно так:
...
@implementation ArrayTestAppDelegate
...
- (void)applicationDidFinishLaunching:(UIApplication*)application
{
...
theArray = [[NSMutableArray alloc] init];
...
rootViewController.theArray = theArray;
[window addSubview:rootViewController.view];
[window makeKeyAndVisible];
}
...
- (void)dealloc
{
[theArray release];
}
...
@end
RootViewController.h
...
@interface RootViewController : UITabBarController
{
...
NSMutableArray* theArray;
...
}
...
@property (nonatomic, retain) NSMutableArray* theArray;
...
RootViewController.m
@implementation RootViewController
...
@synthesize theArray;
...
- (void)dealloc
{
[theArray release];
}
...
- (void)showSecondViewController
{
SecondViewController* secondViewController = [[SecondViewController alloc] initWithNib:@"SecondView"];
secondViewController.theArray = self.theArray;
// Show secondViewController here -- modally, using nav controller stack, etc.
[secondViewController release];
}
...
@end
И так далее. Я оставляю читателю упражнение по реализации theArray
@property
для SecondViewController
(подсказка: очень похоже на RootViewController
)