Я хочу нажать UIViewController из UIView.
Я искал это, и я получил link1 , link2 , но все равно я не получаю, какие изменения мне нужно сделать. !
Мой код выглядит следующим образом
KalGridView.h
@interface KalGridView : UIView { }
KalGridView.m
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // From here I want to push viewController. }
Как я могу это сделать?
Это довольно странный способ структурировать ваш дизайн, но это возможно.
Вашему представлению нужен делегат, который обычно является его собственным контроллером представления.Когда вы создаете свое представление, установите этот делегат для контроллера представления.Затем в вашем методе касания у вас есть ссылка, которую вам нужно нажать на новый контроллер
- обновить - по запросу, вот что вы можете сделать:
Обычно вы можете получить доступ к UINavigationController через appDelegate.Поэтому, если у вас есть свойство UINavigationController в вашем appDelegate, попробуйте этот код:
UINavigationController
[[(iMyApp_AppDelegate*)[[UIApplication sharedApplication] delegate] navigationController] pushViewController:myVC
animated: YES];
Реализация делегата в вашем пользовательском представлении:
@protocol KalGridViewDelegate @interface KalGridView : UIView { id<KalGridViewDelegate> kgDelegate; } @property(nonatomic, assign) id<KalGridViewDelegate> kgDelegate; @protocol KalGridViewDelegate @optional -(void)didTouchInKalGridView:(KalGridView*)view withData:(NSObject*)data; @end
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self.kgDelegate didTouchInKalGridView:self withData:someData]; }
Так что теперь вы можете обрабатывать это событие в любом месте, где есть ваш пользовательский вид.
ИспользованиеNSNotification:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [[NSNotificationCenter defaultCenter] postNotificationName:@"TOUCHED" object:nil]; }
В любой точке вашего кода:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didTouched:) name:@"TOUCHED" object:nil];
И метод для обработки (вероятно, в другом viewcontroller)
- (void)didTouched:(NSNotification*)sender{ // push or pop your viewcontroller here }
Таким образом, ваше представление является основным представлением viewController или содержится где-то в иерархии представлений viewController.
Я бы создал протокол делегата KalGridViewDelegate с помощью такого метода, как:
KalGridViewDelegate
- (void) kalGridViewWasTapped: (KalGridView *) kalGridView;
Затем сделайте UIViewController, чье представление содержит KalGridView делегата этого представления.Итак, скажем, в методе viewDidLoad контроллера представления:
UIViewController
KalGridView
viewDidLoad
self.kalGridView.delegate = self;
Затем в вашем методе касания:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self.delegate kalGridViewWasTapped: self]; }
, и тогда ваш контроллер представления может ответить на метод делегатапри необходимости нажмите следующий контроллер представления.
Если вы не понимаете делегирование, вам следует внимательно прочитать и понять документы Apple:
http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html
, уделяя особое вниманиев разделы Протоколы и Делегирование .
Также
http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18
Взять объект ViewController, в котором размещено представление.Нажмите навигационный контроллер с тем экземпляром, к которому когда-либо просматриваете нужный вам контроллер