2013-09-03 3 views
2

Я пытаюсь вызвать метод, который находится внутри someClass из класса AppDelegate. Обычно я создаю экземпляр, а затем используя этот экземпляр, вызываю метод. Вроде так:вызов метода внутри someClass из AppDelegate Objective-C IOS

FFAppDelegate *delegate = (FFAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[delegate someMethod]; 

Я использую это ^^ совсем немного в своем коде, и он отлично работает. То, что я хочу сделать, это переключить его. Вместо вызова метода INSIDE AppDelegate я хочу вызвать метод внутри другого класса FROM AppDelegate.

SomeClass *test = (SomeClass *) [[UIApplication sharedApplication] delegate]; 
[test someMethod]; 

В этом случае я получаю «Нагрузочное приложение из-за неперехваченное исключение„NSInvalidArgumentException“» ошибку из-за «непризнанный селектор послал к экземпляру».

Любые световые сараи по этому вопросу были бы очень признательны! :)

+2

SomeClass не приложение делегата, так почему Вы создаете экземпляр SomeClass с делегатом [[UIApplication sharedApplication]]?Вам нужно получить ссылку на экземпляр SomeClass - как вы это делаете, зависит от того, создаете ли вы этот экземпляр в делегате приложения или в раскадровке. – rdelmar

+0

Да, это было так. Спасибо :) –

ответ

1

Создайте экземпляр класса, из которого вы хотите отправить запрос, и сделайте этот метод общедоступным (в файле .h). Затем импортируйте этот класс в делегат приложения и вызовите его.

Как так ...

YourClass * yourClassInstance = [[YourClass alloc] init]; 
    [yourClassInstance someMethod]; 

в YourClass.h ниже @interface вы бы объявить метод как так

-(void)someMethod; 

Таким образом, любой может получить доступ к нему.

+0

Это, казалось, сработало, хотя я понятия не имею, почему. У меня было объявление в интерфейсе. Единственное, что изменилось, это [[YourClass alloc] init]; вместо моего [UIApplication sharedApplication]. Еще раз спасибо. –

+0

Это работает, потому что AppDelegate не объявляет метод и не реализует его. Таким образом, вы запрашиваете AppDelegate (то, что вы получаете из singleton, возвращенного из [[UIApplication sharedApplication] delegate]) для его реализации, и там ничего нет. В случае, когда я даю вам, вы получаете экземпляр класса, который реализует метод, который вы запрашиваете, поэтому он работает. Имеет ли это смысл? – AdamG

+0

Да! Даже очень. Еще раз спасибо :) –

2

[[UIApplication sharedApplication] delegate]; вернуть AppDelegate класс, а не SomeClass

вы можете использовать, как это:

FFAppDelegate *delegate = (FFAppDelegate *) [[UIApplication sharedApplication] delegate]; 
[delegate someMethodForSomeClass]; 

, а затем в своем коде AppDelegate someMethodForSomeClass так:

- (void)someMethodForSomeClass 
{ 
    SomeClass *someClass = _yourSomeClass; 
    [someClass someMethod]; 
} 
+0

Именно то, что я искал. Спасибо! –

1

Для примера, если вы хотите создать AlertView только один раз и использовать его в любом UiViewController

Таким образом, вы можете сделать метод для UIAlertView и вызов метода Если вы хотите

1) В вашем appDelegate.h файле

@property (nonatomic, strong) UIAlertView *activeAlertView; 

2) В вашем AppDelegate .m Файл

-(void)openAlert 
{ 
    NSString *strMsgPurchase = @"Write your message"; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Buy" message:strMsgPurchase delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Buy",@"Restore", nil]; 
    [alert setTag:100]; 
    [alert show]; 
    self.activeAlertView = alert; 
} 

3) Для того, чтобы вызвать метод, в котором вы хотите UIView

[((AppDelegate *)[[UIApplication sharedApplication] delegate])openAlert]; 

Примечание: Определение - (Недействительными) openAlert метод в Appdelegate.h файл

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