Вызов функции в AppDelegate? - PullRequest
4 голосов
/ 23 ноября 2011

Следуя решению (на самом деле получившему наибольшее число голосов) на UITextField Пример в Cocos2d , мне удалось это сделать, за исключением строки

[[[UIApplication sharedApplication] delegate] specifyStartLevel];

Я поместил ее в свою сцену, Я получаю это предупреждение:

Метод экземпляра '-specifyStartLevel' не найден (тип возвращаемого значения по умолчанию равен 'id')

Почему это так??Я ясно определил -specifyStartLevel в заголовке и реализации моего AppDelegate ...


Редактировать : Объявление defineStartLevel

#import <UIKit/UIKit.h>

@class RootViewController;

@interface AppDelegate : NSObject <UIApplicationDelegate,UITextFieldDelegate> {
    UIWindow            *window;
    UITextField *levelEntryTextField;
    RootViewController  *viewController;
}
- (void)specifyStartLevel;
@property (nonatomic, retain) UIWindow *window;

@end

И реализация:

- (void)specifyStartLevel
{
    [levelEntryTextField setText:@""];
    [window addSubview:levelEntryTextField];
    [levelEntryTextField becomeFirstResponder];    
}

Ответы [ 4 ]

14 голосов
/ 23 ноября 2011

Прямо сейчас ваш класс ничего не знает о методах вашего делегата. Вам нужно импортировать ваш делегат в вашу реализацию, а не в интерфейс (чтобы избежать циклического импорта).

Например,

#import "AppDelegate.h"

Затем вы должны привести возвращенный делегат в вызов вложенного метода к типу вашего делегата. Например:

[(AppDelegate *)[[UIApplication sharedApplication] delegate] specifyStartLevel];
5 голосов
/ 24 февраля 2014
  1. Добавьте метод в файл AppDelegate.h, например:

    - (void)Welcome
    
  2. Реализуйте метод в файле AppDelegate.m, например:

     - (void)Welcome
     {
         NSLog(@"Welcome")
    
     }
    
  3. Установите делегата UIApplication в таком методе, как:

    AppDelegate *appDelegate=[UIApplication sharedApplication] delegate];
    
    [appDelegate Welcome];
    
3 голосов
/ 23 ноября 2011

-[UIApplication delegate] возвращает объект типа id<UIApplicationDelegate>, поэтому компилятор знает только методы, на которые отвечают объекты этого типа, даже если ваш пользовательский делегат отвечает на specifyStartLevel.Вы можете либо проигнорировать предупреждение, либо привести возвращаемое значение -[UIApplication delegate]:

[(YourCustomAppDelegate *) [[UIApplication sharedApplication] delegate] specifyStartLevel];
3 голосов
/ 23 ноября 2011

Вам необходимо импортировать AppDelegate в файл .m, где вы используете

[[[UIApplication sharedApplication] delegate] specifyStartLevel];

Мне нравится импортировать его с заголовком, который дает мне ярлык.

GlobalData.h

#import "AppDelegate.h"
#define APPDELEGATE (AppDelegate *)[[UIApplication sharedApplication] delegate]

Затемкогда я использую его в любом классе, я просто

#import "GlobalData.h"

// to gain access to the delegate
AppDelegate * appDelegate = APPDELEGATE;

Я использую этот подход, потому что тогда я могу хранить больше # define для некоторых глобальных констант (например, soundFXVolume - #define SOUND_FX_V 0.6)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...