2014-01-03 3 views
0

я встретить очень странную вещь сегодня: что мой обычай ViewController иногда не хватает в респондеров цепиViewController иногда пропускает цепочку ответчиков?

первый у меня есть пользовательские UIView с UIButton как его подвид, то я установить цель-действие, как обычно:

[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 

конечно, я реализовать closeButtonPressed метод в моем обычае UIViewController

в самый раз, он просто работал отлично. но иногда мой ViewController пропускает событие крана, и, наконец, я обнаружил, что событие перехода переходит к AppDelegate, и метод closeButtonPressed в AppDelegate вызывается!

Я провел целый день в этой проблеме и до сих пор не знаю почему. вы можете дать мне ключ? большое спасибо. Ниже приведен код, надеюсь, что это может помочь:

код для инициализации и представить свой ViewController и Вид:

YLSRegisterStepOneViewController *step1Controller = [[YLSRegisterStepOneViewController alloc] initWithNibName:nil bundle:nil]; 
step1Controller.view = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType]; 
step1Controller.modalPresentationStyle = UIModalPresentationFormSheet; 
step1Controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentViewController:step1Controller animated:YES completion:nil]; 

код в UIView:

UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
closeButton.frame = CGRectMake(10, 10, 50, 50); 
[closeButton setTitle:NSLocalizedString(@"button_close", @"") forState:UIControlStateNormal]; 
[closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 

[self addSubview:closeButton]; 

Кодекса UIViewController :

-(void) closeButtonPressed 
{ 
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];// to dismiss self 
} 

дополнительное: в сторону UIButton имеется UITextField. когда эта проблема возникает, если я нажимаю UITextField, затем нажмите UIButton, UIViewController работает отлично

+0

Вы установили свойство 'controller' в' YLSRegisterStepOneView'. – KudoCC

+0

в первой версии, я не установил, но код работает из-за цепи ответчика ... тогда я нахожу эту проблему и пытаюсь установить свойство контроллера, но проблема остается. что меня больше всего смущает: это не происходит каждый раз, но случайно, иногда – michael

+0

Можете ли вы показать мне, как вы установили свойство. – KudoCC

ответ

1

Вы установили контроллер свойство YLSRegisterStepOneView так:

YLSRegisterStepOneViewController *step1Controller = [[YLSRegisterStepOneViewController alloc] initWithNibName:nil bundle:nil]; 
YLSRegisterStepOneView *step1View = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType]; 
step1Controller.view = step1View; 
step1View.controller = step1Controller; 

Вы добавить кнопку в YLSRegisterStepOneViewinitWithFrame: метода «s, не так ли?

So [closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside]; self.controller здесь по-прежнему ноль.

step1View.controller = step1Controller; вызывается после [closeButton addTarget:self.controller action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside];

обновление: Вы говорите, что ответчик цепи путает вас, я думаю, что проблема в том, что вы назначаете свойства вида Вид контроллера, как этот step1Controller.view = step1View;, не рекомендуется. Если вы хотите использовать свое собственное представление в качестве вида viewcontroller, сделайте следующее:

Переопределить loadView метод в viewcontroller. Вы можете переопределить этот метод, чтобы вручную создавать свои представления. Если вы решите это сделать, присвойте корневому представлению вашей иерархии представлений свойство вида. Создаваемые вами представления должны быть уникальными экземплярами и не должны использоваться совместно с каким-либо другим объектом контроллера. Ваша пользовательская реализация этого метода не должна быть вызвана супер.

- (void)loadView 
{ 
    YLSRegisterStepOneView *step1View = [[YLSRegisterStepOneView alloc] initWithFrame:CGRectMake(0, 0, 540, 720) OperType:operType]; 
    self.view = step1View ; 
} 
+0

о да! какой глупый я. я думаю, что это имеет смысл, я попробую, что вы скажете. но я все еще путаю, почему это случается изредка, я думаю, что даже цель равна нулю, механизм цепи ответчика должен что-то делать ..., но по крайней мере, может быть, вы укажете путь к решению этой проблемы. – michael

+0

да, теперь я устанавливаю свойство контроллера, когда Я запускаю UIView, и он отлично работает. Спасибо тебе друг. однако цепочка респондентов все еще путает меня, я последую за ней – michael

+0

@michael Я обновил свой ответ. – KudoCC

0

Я не вижу, где вы устанавливаете свойство контроллера пользовательского зрения, которые вы проходящие здесь:

[closeButton addTarget:*self.controller* action:@selector(closeButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 

Я думаю, что если вы создадите/установите свойство контроллера в своем представлении, это решит проблему (если вы уже не делаете этого, но кода здесь нет).

+0

привет, спасибо за ответ. На самом деле, я попробую, что вы говорите, но это не работает. на самом деле, когда я устанавливаю свойство контроллера, ViewController по-прежнему пропускает событие изредка. что меня смутило: это случается иногда, не каждый раз – michael

Смежные вопросы