Существует несколько способов, которыми объекты могут инициировать действия, общаться с другими объектами и / или наблюдать изменения, в которых они заинтересованы, включая:
- UIControl привязки к цели / действию
- Протоколы
- Наблюдение за ключом / значением (KVO)
- Уведомления
Я не думаю, что в этом случае вам нужны уведомления. Уведомления являются наиболее подходящими, когда объект, публикующий уведомление, не заботится о том, какие объекты наблюдают за уведомлением, и может присутствовать один или несколько наблюдателей. В случае нажатия кнопки обычно требуется, чтобы конкретный объект обрабатывал действие.
Я бы рекомендовал использовать протокол. Вы увидите множество протоколов, используемых в платформах iOS, в основном любой класс, имеющий свойство delegate
, обычно определяет протокол, которому должны соответствовать делегированные объекты. Протокол - это контракт между двумя объектами, так что объект, определяющий протокол, знает, что он может взаимодействовать с объектом, соответствующим протоколу, без каких-либо других предположений относительно его класса или цели.
Вот пример реализации. Извинения, если какие-либо опечатки / упущения.
В caller.h (я предполагал, что caller является UIViewController):
@class Caller
@protocol CallerDelegate
- (void)userDidSplashFromCaller:(Caller *)caller;
@end
@interface Caller : UIViewController
id <CallerDelegate> delegate;
@end
@property (nonatomic, assign) id <CallerDelegate> delegate;
@end
В звонилке м .:
@implementation Caller
@synthesize delegate;
- (void)viewDidLoad {
// whatever you need
// you can also define this in IB
[btnSplash addTarget:self forAction:@selector(userTouchedSplashButton)];
}
- (void)dealloc {
self.delegate = nil;
[super dealloc];
}
- (void)userTouchedSplashButton {
if (delegate && [delegate respondsToSelector:@selector(userDidSplashFromCaller:)]) {
[delegate userDidSplashFromCaller:self];
}
}
в другом ViewController.m:
// this assumes caller is pushed onto a navigationController
- (void)presentCaller {
Caller *caller = [[Caller alloc] init];
caller.delegate = self;
[self.navigationController pushViewController:caller animated:YES];
[caller release];
}
// protocol message from Caller instance
- (void)userDidSplashFromCaller:(Caller *)caller {
NSLog(@"otherVC:userDidSplashFromCaller:%@", caller);
}
[РЕДАКТИРОВАТЬ: УТОЧНЕНИЯ]
После того, как я снова посмотрел на ваш вопрос и код, я понял, что сделал некоторые предположения, которые могут оказаться неверными в вашем коде. Скорее всего, вы все равно должны использовать протокол, но точный способ интеграции моего примера зависит от вашего приложения. Я не знаю, какой класс Caller
есть в вашем приложении, но что бы это ни было, он имеет дело с UIButtons, так что это, скорее всего, контроллер представления или представление.
Ваш комментарий о том, что у вас нет правильного экземпляра вашего appViewController, заставляет меня задуматься, понимаете ли вы разницу между классами и экземплярами класса. Если мой ответ вам не поможет, пожалуйста, опубликуйте еще немного кода, показывающего, как вы создаете и представляете свой контроллер представления, а также как вы настраиваете кнопку, и я могу попытаться уточнить мой ответ.