Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
#1

Переопределение метода в сабклассе делегата - Objective-C

25.10.2014, 18:05. Просмотров 1063. Ответов 12
Метки нет (Все метки)

Сабж. Есть класс1, реализует некий метод некого протокола. Как в классе 2(наследник класса1) переопределить этот метод (не считая категории и обьявления протокола класса1 и его реализации в классе2)?
Неужели нельзя переопределить просто при насаледовани?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2014, 18:05     Переопределение метода в сабклассе делегата
Посмотрите здесь:
Переопределение метода только в iOS >= 7.0 Objective-C
C# При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
C# Вызов метода(делегата) из неуправляемого кода
C# Запретить передачу частного метода посредством делегата
создание делегата через имя метода в строке C# .NET 4.x
C# .NET 4.x Покажите пример работы делегата для параметризованного метода
Java SE Переопределение метода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
25.10.2014, 23:42     Переопределение метода в сабклассе делегата #2
Есть класс1, реализует некий метод некого протокола. Как в классе 2(наследник класса1) переопределить этот метод (не считая категории и объявления протокола класса1 и его реализации в классе2)?
По точнее.
Если просто сделать override метода то просто

Objective-C
1
2
3
4
-(void) method {
    [super method]; // << вызов родительского method
    // дополнительный код
}
Для категорий делать подобное недопустимо, разрешается объявлять только новые методы

Добавлено через 3 минуты
Есть класс1, реализует некий метод некого протокола
Сам по себе протокол ничего не содержит. Следовательно можно переопределить (override) любой метод в наследуемом классе строчками указанными выше.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 05:06  [ТС]     Переопределение метода в сабклассе делегата #3
Неа. Всё равно в подклассе нужный метод не вызывается.
Есть класс, который подготавливает запрос NSURLConnection и реализовывает все его методы.
GetData.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface GetData : NSObject <NSURLConnectionDelegate>
 
-(void)getDataFromURL:(NSString *)url
        isPostRequest:(BOOL)isPostRequst
           parameters:(NSString *)parameters
             delegate:(id)delegate
     showActivityView:(BOOL)showActivity;
 
@property (nonatomic, assign) id delegate;
@property (nonatomic, assign) int tag;
 
@end
 
@protocol GetDataDelegate
 
@optional
-(void)getData:(GetData*)getData succeededWithData:(NSMutableData*)receivedData;
-(void)getData:(GetData*)getData FailedWithError:(NSString*)error;
 
@end
Есть абстрактный класс, который явлается наследником UIViewController
MapScreen.h
Objective-C
1
2
3
4
@interface MapScreen : UIViewController <GMSMapViewDelegate, GetDataDelegate>
@property (weak, nonatomic) IBOutlet GMSMapView *mapView;
-(id)init;
@end
MapScreen.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
//где то в коде
GetData *getNewPlacemarks = [[GetData alloc]init];
[getWashes getDataFromURL:@""
                    isPostRequest:NO
                       parameters:[NSString stringWithFormat:@"start_lat=%f&start_lon=%f&end_lat=%f&end_lon=%f", startLat, startLon, endLat, endLon]
                         delegate:self
                 showActivityView:YES];
//где то вызывается метод, о неудачном соединении
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error{
    //что то там
}
И, наконец, есть конкретный подкласс ArriveNow.
ArriveNow.h
Objective-C
1
2
@interface ArriveNow : MapScreen
@end
В котором нужно переопределить метод
Objective-C
1
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error
Но в этом классе не вызывается ни один один наследованный метод, кроме init (его я переопределил)
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
26.10.2014, 05:49     Переопределение метода в сабклассе делегата #4
@property (nonatomic, assign) id delegate;
Все делегаты должны быть WEAK ссылками! c указанием какой протокол они делегируют

@property (weak, nonatomic) id<GetDataDelegate> delegate;
чтобы прокотол был виден до его объвляния достаточно написать

@protocol GetDataDelegate;

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@protocol GetDataDelegate;
 
@interface GetData : NSObject <NSURLConnectionDelegate>
 
-(void)getDataFromURL:(NSString *)url
        isPostRequest:(BOOL)isPostRequst
           parameters:(NSString *)parameters
             delegate:(id<GetDataDelegate>)delegate
     showActivityView:(BOOL)showActivity;
 
@property (weak, nonatomic) id<GetDataDelegate> delegate;
@property (nonatomic) int tag;
 
@end
 
// <<
 
@protocol GetDataDelegate
 
@optional
-(void)getData:(GetData*)getData succeededWithData:(NSMutableData*)receivedData;
-(void)getData:(GetData*)getData FailedWithError:(NSString*)error;
 
@end
---------

покажи исходный код где вызываешь у делегата "события"
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 07:44  [ТС]     Переопределение метода в сабклассе делегата #5
Цитата Сообщение от noname_club Посмотреть сообщение
покажи исходный код где вызываешь у делегата "события"
GetData.m
Objective-C
1
2
3
4
5
6
7
8
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    receivedData = nil;
    [self hideActivityWithOverlay];
    if ([self.delegate respondsToSelector:@selector(getData:FailedWithError:)]) {
        [self.delegate getData:self FailedWithError:[error localizedDescription]];
    }
 
}
MapScreen.m
Objective-C
1
2
3
-(void)getData:(GetData *)getData FailedWithError:(NSString *)error{
    NSLog(@"method called from parent");
}
А у наследника MapScreen он не вызывается
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
26.10.2014, 11:24     Переопределение метода в сабклассе делегата #6
Objective-C
1
2
3
if ([self.delegate respondsToSelector:@selector(getData:FailedWithError:)]) {
        [self.delegate getData:self FailedWithError:[error localizedDescription]];
    }
брейкпоинт поставь и проверь действительно ли все работает.

Objective-C
1
connection:(NSURLConnection *)connection didFailWithError
Чтобы NSURLConnection вернуло fail надо просто поднять firewall
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 11:46  [ТС]     Переопределение метода в сабклассе делегата #7
Цитата Сообщение от noname_club Посмотреть сообщение
брейкпоинт поставь и проверь действительно ли все работает.
всё работает, проверял неоднократнно. метод вызывается у родителя, а у наследника - нет.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
26.10.2014, 11:57     Переопределение метода в сабклассе делегата #8
истина где рядом брейкпоинте лучше.
Проверьте дейтвительно ли экзепмляр того класса вызываете.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 12:10  [ТС]     Переопределение метода в сабклассе делегата #9
Цитата Сообщение от noname_club Посмотреть сообщение
Проверьте дейтвительно ли экзепмляр того класса вызываете.
вызываю экземпляр наследника.
но соединение инициализирую в родителе. может тут где то собака зарылась?
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
28.10.2014, 07:29  [ТС]     Переопределение метода в сабклассе делегата #10
Цитата Сообщение от noname_club Посмотреть сообщение
Проверьте дейтвительно ли экзепмляр того класса вызываете.
Вернулся к этой проблеме, выяснил, что при иницализации возвращается экземпляр класса родителя.
По сути:
Инит в родителе.
Objective-C
1
2
3
4
5
6
-(id)init{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    self = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
    if (!self) return nil;
    return self;
}
инит в наследнике
Objective-C
1
2
3
4
5
-(id)init{
    self = [super init];
    if (!self) return nil;
    return self;
}
Пытался так же тип явно преобразовать, всё равно возвращается экземпляр класса родителя.
Что я делаю не так?
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
28.10.2014, 07:40     Переопределение метода в сабклассе делегата #11
Objective-C
1
2
3
4
5
6
-(id)init{
* * UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
* * self = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
* * if (!self) return nil;
* * return self;
}
Ну так бред же написан. -init вызывается у уже созданного объекта с помощью +alloc, и он должен возвращать тот же указатель, что и +alloc (или nil, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
28.10.2014, 07:59  [ТС]     Переопределение метода в сабклассе делегата #12
Цитата Сообщение от glvrzzz Посмотреть сообщение
Ну так бред же написан. -init вызывается у уже созданного объекта с помощью +alloc, и он должен возвращать тот же указатель, что и +alloc (или nil, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
тогда как в ините мне загрузить экземпляр со сториборда правильно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2014, 08:08     Переопределение метода в сабклассе делегата
Еще ссылки по теме:
C# Переопределение метода
Переопределение метода ToString() C#
Переопределение метода equals Java SE
Android Переопределение метода в Runtime

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
28.10.2014, 08:08     Переопределение метода в сабклассе делегата #13
residentkms, загружайте не в ините. Его вообще удалите.
Objective-C
1
2
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"MapScreen"];
Yandex
Объявления
28.10.2014, 08:08     Переопределение метода в сабклассе делегата
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru