Как я могу указать цель, на которую должно указывать мое действие?

Я изучаю target-c для iOS и у меня есть вопрос о создании моего первого механизма target-action. У меня это работает, но в настоящее время я просто установил target: часть addTarget:action:changeForControlEvents: метод для nilЭто означает, что он будет искать цель в моем приложении, а не углубляться в ViewController.m, где находится метод, который я хочу отправить сообщение.

Как я могу рассказать addTarget:action:changeForControlEvents: метод, какой класс искать в первую очередь?

Вот простая версия моего текущего кода:

Вид:

// View.m
#import View.h

@implementation

- (void)sendAction
{
     UIControl *button = [[UIControl alloc] init];
     [button addTarget:nil  // How do I make this look for ViewController.m?
                action:@selector(changeButtonColor) 
changeforControlEvents:UIControlEventTouchUpInside];
}
@end

... и контроллер просмотра:

// ViewController.m
#import ViewController.h

@implementation

- (void)target
{
     NSLog(@"Action received!");
}
@end

Спасибо за помощь!

2 ответа

Решение

Вы не можете просто позвонить UIViewController если он не загружается или не выделяется в памяти. Для достижения этого вам нужно выделить этот класс.

один способ сделать с помощью синглтона

[button addTarget:[ViewController sharedManager] action:@selector(target) 
forControlEvents:UIControlEventTouchUpInside];

или используя NSNotificationCenter, предполагая, что класс уже запущен (стек в предыдущей навигации / другие вкладки).

// View.m
#import View.h
@implementation

- (void)sendAction
{
     UIControl *button = [[UIControl alloc] init];
     [button addTarget:self 
                action:@selector(controlAction) 
changeforControlEvents:UIControlEventTouchUpInside];
}

-(void)controlAction
{
 [[NSNotificationCenter defaultCenter] 
        postNotificationName:@"changeButtonColor" 
        object:self];
}
@end

и для цели UIViewController

// ViewController.m
#import ViewController.h

@implementation
-(void) viewDidLoad
{
   [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(receiveNotification:) 
        name:@"changeButtonColor"
        object:nil];

- (void)receiveNotification:(NSNotification *) notification

{
     NSLog(@"Action received!");
}
@end

Предполагая, что ViewController является VC, который создал представление, в котором вы работаете, вы должны иметь возможность использовать:

addTarget: [само наблюдение]

Другие вопросы по тегам