Попытка «включить / выключить» различные методы UITapGestureReconginzer - PullRequest
0 голосов
/ 30 июля 2011

У меня есть этот прекрасный актив навигационной панели:

представление navBar http://dl.dropbox.com/u/1734050/ViewWithNavBar.jpg

, и когда пользователи нажимают на среднюю кнопку (одна со стрелками), она вызывает эту другую прекрасную "окно общего доступа "asset

раскрывающийся список shareBox с navBar http://dl.dropbox.com/u/1734050/navBarWithShareBox.jpg

То, что у меня есть в коде, так это то, что при нажатии на экран появляется навигационная панель, которая исчезает при следующем нажатии.,Во-вторых, когда пользователь нажимает на кнопку «поделиться», появляется окно общего доступа, и пользователь может нажать за пределами окна, чтобы закрыть его.

Вот проблема: я не могу закрыть навигационную панель послеподнимая окно общего доступа!

Вот некоторый код:

-(void)viewDidLoad {

...
...
...

    UITapGestureRecognizer *tapNavBar = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapForNavBar:)];
    self.tapForNavBar = tapNavBar;

    [self.viewForTaps addGestureRecognizer:self.tapForNavBar];

    // btw, tapForNavBar is a UITapGestureRecognizer instance variable.
    // also, viewForTaps is a view (instance variable) I made to handle 
    // where the user could tap (most of the screen)

}


#pragma mark -
#pragma mark Tap and Gesture Methods

-(void)handleTapForNavBar:(UIGestureRecognizer *)gestureRecognizer {

    if (self.navBarIsHidden) {

        [UIView animateWithDuration:0.5 animations:^ {
            //self.primeViewController.view.alpha = 0.8;
            self.navBar.alpha = 1.0;
        }];
        self.detailViewButton.userInteractionEnabled = YES;
        self.shareButton.userInteractionEnabled = YES;
        self.aboutAppButton.userInteractionEnabled = YES;
        self.navBarIsHidden = NO;
    }
    else {
        [UIView animateWithDuration:0.5 animations:^ {
            self.navBar.alpha = 0.0;
            //self.primeViewController.view.alpha = 1.0;
        }];
        self.detailViewButton.userInteractionEnabled = NO;
        self.shareButton.userInteractionEnabled = NO;
        self.aboutAppButton.userInteractionEnabled = NO;
        self.navBarIsHidden = YES;
    }   

}

Хорошо, так что все должно выглядеть шикарно (и работает так же!) - теперь вот, пожалуй, где этостановится неортодоксальным?

-(IBAction)showShareMenu:(id)sender {

    if (self.navBarShareBoxIsHidden) {
        [UIView animateWithDuration:0.5 animations:^ {
            self.navBarShareBox.alpha = 1.0;
        }];  
        [self.tapForNavBar removeTarget:nil action:NULL];
        UITapGestureRecognizer *tapShareBox = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapForShareBox:)];
        self.tapForShareBox = tapShareBox;

        [self.viewForTaps addGestureRecognizer:self.tapForShareBox];
        self.navBarShareBoxIsHidden = NO;
        self.twitterButton.userInteractionEnabled = YES;
        self.facebookButton.userInteractionEnabled = YES;
        self.googlePlusButton.userInteractionEnabled = YES;
    }
    else {
        [UIView animateWithDuration:0.5 animations:^ {
            self.navBarShareBox.alpha = 0.0;
        }];  
        [self.tapForShareBox removeTarget:nil action:NULL];
        [self.tapForNavBar addTarget:self action:@selector(handleTapForNavBar:)];
        self.navBarShareBoxIsHidden = YES;
        self.twitterButton.userInteractionEnabled = NO;
        self.facebookButton.userInteractionEnabled = NO;
        self.googlePlusButton.userInteractionEnabled = NO;
    }
}

Затем я создаю этот метод для обработки конкретного нажатия на shareBox:

-(void)handleTapForShareBox:(UIGestureRecognizer *)gestureRecognizer {

    if (!self.navBarShareBoxIsHidden) {
        [UIView animateWithDuration:0.5 animations:^ {
            self.navBarShareBox.alpha = 0.0;
        }];
        self.navBarShareBoxIsHidden = YES;
        self.twitterButton.userInteractionEnabled = NO;
        self.facebookButton.userInteractionEnabled = NO;
        self.googlePlusButton.userInteractionEnabled = NO;
        [self.tapForShareBox removeTarget:nil action:NULL];
        [self.tapForNavBar addTarget:self action:@selector(handleTapForNavBar:)];
    }

}

Я предполагаю, что моя проблема исходит от alloc / init ingновый UITapGestureRecognizer в методе -(IBAction)showShareMenu.Я подумал, что используя сообщения removeTarget ... и addTarget, я мог легко сказать своему коду, какой метод TapGesture он должен использовать, но, учитывая, что он не работает, я ошибся!Где я неправ?Если вам нужна дополнительная информация, я с удовольствием предоставлю больше.

1 Ответ

0 голосов
/ 31 июля 2011

Ах, Ха!Похоже, я нашел решение!В моем методе handleTapForShareBox я сделал это:

-(void)handleTapForShareBox:(UIGestureRecognizer *)gestureRecognizer {

    if (!self.navBarShareBoxIsHidden) {
        [UIView animateWithDuration:0.5 animations:^ {
            self.navBarShareBox.alpha = 0.0;
        }];
        self.navBarShareBoxIsHidden = YES;
        self.twitterButton.userInteractionEnabled = NO;
        self.facebookButton.userInteractionEnabled = NO;
        self.googlePlusButton.userInteractionEnabled = NO;
        [self.tapForShareBox removeTarget:nil action:NULL];
        //[self.tapForNavBar addTarget:self action:@selector(handleTapForNavBar:)];

        // Here is the new stuff, I added another alloc init of a UITapGestureRecognizer
        // and re-assigned it to my UITap instance variable

        UITapGestureRecognizer *tapNavBar = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapForNavBar:)];
        self.tapForNavBar = tapNavBar;

        [self.viewForTaps addGestureRecognizer:self.tapForNavBar];
    }
}

Теперь он прекрасно работает!Однако было несколько вещей:

1) Нужно ли освобождать созданный мной локальный указатель UITapGestureRecognizer?Или потому что я initWithTarget будет автоматически освобожден?

2) Это хак?Или это правильный способ передачи различных методов крана?Я просто немного сбит с толку, почему removeTarget и addTarget не добились цели.

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