Как правильно разделить UIControl на подклассы?

Передайте человека при создании объекта команды:

ICommand command = new DeletePersonCommand(person);

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

class DeletePersonCommand : ICommand
{
   private Person person;
   public DeletePersonCommand(Person person)
   {
      this.person = person;
   }

   public void Execute()
   {
      RealDelete(person);
   }
}
66
задан Jayesh Thanki 8 May 2018 в 11:53
поделиться

2 ответа

I think that you forgot to add [super] calls to touchesBegan/touchesEnded/touchesMoved. Methods like

(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event    
(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event

aren't working if you overriding touchesBegan / touchesEnded like this :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   NSLog(@"Touches Began");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
   NSLog(@"Touches Moved");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
   NSLog(@"Touches Ended");
}

But! All works fine if methods will be like :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
   [super touchesBegan:touches withEvent:event];
   NSLog(@"Touches Began");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
   [super touchesMoved:touches withEvent:event];
     NSLog(@"Touches Moved");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
   [super touchesEnded:touches withEvent:event];
   NSLog(@"Touches Ended");
}
9
ответ дан 24 November 2019 в 14:58
поделиться

Самый простой подход, который я часто использую, - это расширить UIControl, но использовать унаследованный метод addTarget для получения обратных вызовов для различных событий. Ключ состоит в том, чтобы прислушиваться к отправителю и событию, чтобы вы могли узнать больше информации о фактическом событии (например, место, где произошло событие).

Итак, просто создайте подкласс UIControl, а затем в init (убедитесь, что ваш initWithCoder также настроен, если вы используете перья), добавьте следующее:

[self addTarget:self action:@selector(buttonPressed:forEvent:) forControlEvents:UIControlEventTouchUpInside];

Конечно, вы можете выбрать любое из стандартных событий управления, включая UIControlEventAllTouchEvents. Обратите внимание, что в селектор будут переданы два объекта. Первый - это контроль. Вторая - это информация о мероприятии. Вот пример использования события касания для переключения кнопки в зависимости от того, нажимал ли пользователь слева и справа.

- (IBAction)buttonPressed:(id)sender forEvent:(UIEvent *)event
{
    if (sender == self.someControl)
    {        
        UITouch* touch = [[event allTouches] anyObject];
        CGPoint p = [touch locationInView:self.someControl];
        if (p.x < self. someControl.frame.size.width / 2.0)
        {
            // left side touch
        }
        else
        {
            // right side touch
        }
    }
}

Конечно, это для довольно упрощенных элементов управления, и вы можете достичь точки, когда это не даст вам достаточной функциональности,

9
ответ дан 24 November 2019 в 14:58
поделиться