iPhone: Как вставить или представить UIViewController из файла UIView? - PullRequest
0 голосов
/ 13 октября 2011

Я хочу нажать 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. 
}

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 13 октября 2011

Это довольно странный способ структурировать ваш дизайн, но это возможно.

Вашему представлению нужен делегат, который обычно является его собственным контроллером представления.Когда вы создаете свое представление, установите этот делегат для контроллера представления.Затем в вашем методе касания у вас есть ссылка, которую вам нужно нажать на новый контроллер

- обновить - по запросу, вот что вы можете сделать:

1 голос
/ 13 октября 2011
  1. Обычно вы можете получить доступ к UINavigationController через appDelegate.Поэтому, если у вас есть свойство UINavigationController в вашем appDelegate, попробуйте этот код:

    [[(iMyApp_AppDelegate*)[[UIApplication sharedApplication] delegate] navigationController] pushViewController:myVC
    

    animated: YES];

  2. Реализация делегата в вашем пользовательском представлении:

    @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
    

    KalGridView.m

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
        [self.kgDelegate didTouchInKalGridView:self withData:someData];  
    }
    

    Так что теперь вы можете обрабатывать это событие в любом месте, где есть ваш пользовательский вид.

  3. Использование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
    }
    
0 голосов
/ 13 октября 2011

Таким образом, ваше представление является основным представлением viewController или содержится где-то в иерархии представлений viewController.

Я бы создал протокол делегата KalGridViewDelegate с помощью такого метода, как:

- (void) kalGridViewWasTapped: (KalGridView *) kalGridView;

Затем сделайте 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

0 голосов
/ 13 октября 2011

Взять объект ViewController, в котором размещено представление.Нажмите навигационный контроллер с тем экземпляром, к которому когда-либо просматриваете нужный вам контроллер

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