Obj-C, iOS, как мне написать / использовать стандартный класс, который будет содержать touchesBegan, touchesMoved и т. Д.? - PullRequest
0 голосов
/ 05 мая 2011

Я собираюсь использовать один и тот же код, который есть в моем контроллере представлений в нескольких представлениях, и я не хочу вставлять код в каждое из них.

Может кто-нибудь показать мне несколькостроки кода, показывающие мне, как это сделать?

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

Ответы [ 3 ]

2 голосов
/ 16 мая 2011

Если я правильно понимаю вопрос, вы хотите, чтобы один и тот же бит кода выполнялся для touchesBegan, touchesMoved ... для каждого из ваших представлений.

Я бы сделал это, используя шаблон делегата.

@protocol ViewTouchDelegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
@end

@interface ViewA : UIView {
    id <ViewTouchDelegate> touchDelegate;
}

@implementation ViewA
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self->touchDelegate touchesBegan:touches withEvent:event];
}
@end // End View A

@interface ViewB : UIView {
    id <ViewTouchDelegate> touchDelegate;
}

@implementation ViewB
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self->touchDelegate touchesBegan:touches withEvent:event];
}
@end // End View B

Это позволит вам разместить весь код обработки касания в одном месте (в классе, соответствующем протоколу ViewTouchDelegate) и передать этот делегат каждому из ваших представлений.

В моем примере я сделал подпись прикосновений Началась так же, как прикосновения UIResponder Начала, но вы можете настроить ее под свои нужды.

Редактировать: пример ViewTouchDelegate

@interface MyViewTouchDelegate : NSObject <ViewTouchDelegate>
@end

@implementation MyViewTouchDelegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //put all your common touch handling code in here
}
@end

Определите любые дополнительные методы, которые вам нужны в протоколе ViewTouchDelegate для ваших целей, например, touchsMoved, touchesEnded, yourOwnCustomEvent.

1 голос
/ 16 мая 2011

Как отметили Antwan и jjwchoy , существует несколько способов сделать что-то подобное. В большинстве языков ООП подклассы являются предпочтительным способом. Подкласс наследует все удовольствия своего суперкласса, а также ваше пользовательское поведение. Для этого вы должны реализовать класс так, как показано ниже:

В JULView.h (название вашего нового класса) будет такой код

#import <Foundation/Foundation.h>
//... #import for all of the other classes/libraries you need

@interface JULView : UIView
{
  // your iVars go here
}

// Your Custom Properties and Methods go here
- (void)customMethod

@end

А В файле реализации ( JULView.m )

#import "JULView.h"

// Synthesize your properties here
@implementation JULView

#pragma mark - Initialization
- (id)init
{
  [super init];
  // Additional initialization
}

#pragma mark - Custom methods
- (void)customMethod1
{
  // A custom method code
}

#pragma mark - Overwritten UIView Methods
// Your touch handling stuff
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  // Your code
}

@end

Чтобы использовать этот новый подкласс, просто импортируйте файл заголовка

#import "JULView.h"

в класс, который вы используете, и создание экземпляра JULView так же, как и в UIView

// instead of
UIView *aView = [[UIView alloc] init];

// you would use
JULView *aView = [[JULView alloc] init];

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

Категории расширение существующего класса дополнительными методами или вашей версии существующих методов. Например, допустим, вы хотите добавить метод, который возвращает первую букву строки в NSString. Для этого вы должны создать категорию следующим образом:

Интерфейс - JULString.h

#import NSString

@interface NSString (JULString)

-(NSString *) firstLetter;

@end

Реализация. Типичное соглашение заключается в том, что именем категории является имя класса, который вы расширяете, за которым следует «+» и название категории. В этом случае файл будет называться NSString + JULString.m

#import "NSString+JULString.h"

@implementation NSString ( JULString )

- (NSString *)firstLetter
{
  return [NSString stringWithFormat:@"%C", [self characterAtIndex:1]];
}
@end

Отличительная особенность категорий заключается в том, что теперь они расширяют поведение ЛЮБОГО экземпляра класса, с которым вы работаете. Другими словами, любая NSString в вашем приложении будет иметь ваши новые методы (при условии, что вы, конечно, импортируете правильный заголовочный файл). Однако будьте осторожны, так как с большой силой приходит большая ответственность. Перезапись класса с использованием категории поведения может привести к нежелательным последствиям, поэтому будьте осторожны.

Несколько ссылок, которые вы можете проверить:

Примечание: У меня нет моего Mac, поэтому я пишу этот код в основном на макушке (и использую некоторый код с сайтов выше в качестве напоминания). Поэтому заранее прошу прощения за любые ошибки;)

1 голос
/ 05 мая 2011

Создайте надлежащий суперкласс, который будет нуждаться в , чтобы быть разделенным на подклассы для выполнения определенных задач, для которых он вам нужен.Это одна из многих причин, почему ООП так хорош: P

Например, каждый объект, который вы создаете в target-c, является подклассом NSObject, который содержит стандартные методы, такие как release retain и init, которые первоначально создаютobject.

Если вы захотите написать код для игры, вы можете создать суперкласс, который называется object, который будет разделен на подклассы для определения определенных типов объектов, таких как props или ragdolls.

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