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

Objective-C

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

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

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

Сабж. Есть класс1, реализует некий метод некого протокола. Как в классе 2(наследник класса1) переопределить этот метод (не считая категории и обьявления протокола класса1 и его реализации в классе2)?
Неужели нельзя переопределить просто при насаледовани?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2014, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределение метода в сабклассе делегата (Objective-C):

Переопределение метода только в iOS >= 7.0 - Objective-C
Такое возможно ? К примеру у меня есть класс, в нем метод - (void)drawRect:(CGRect)rect { .... } В iOS < 7.0 он вообще...

Переопределение init - Программирование iOS
есть класс @interface VerifyWindow : UIAlertView @end #import "VerifyWindow.h" @implementation VerifyWindow - (id)init; ...

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет? - C#
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата с именем метода, имя метода...

Вызов метода(делегата) из неуправляемого кода - C#
Есть способ передать адрес делегата в неуправляемый код как адрес функции, кто нибудь решил эту задачу для использования в своих проектах?...

.NET 4.x создание делегата через имя метода в строке - C#
Нашёл как создать делегат с помощью анонимного метода или лямбда-оператора, но это как-то криво выглядит, т.к. приходится брать у искомого...

Запретить передачу частного метода посредством делегата - C#
Как запретить такое поведение ? using System; namespace ConsoleApplicationNS2 { using ConsoleApplicationNS1; public class...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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) любой метод в наследуемом классе строчками указанными выше.
0
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 (его я переопределил)
0
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
---------

покажи исходный код где вызываешь у делегата "события"
1
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 он не вызывается
0
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
0
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 11:46  [ТС] #7
Цитата Сообщение от noname_club Посмотреть сообщение
брейкпоинт поставь и проверь действительно ли все работает.
всё работает, проверял неоднократнно. метод вызывается у родителя, а у наследника - нет.
0
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
26.10.2014, 11:57 #8
истина где рядом брейкпоинте лучше.
Проверьте дейтвительно ли экзепмляр того класса вызываете.
0
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
26.10.2014, 12:10  [ТС] #9
Цитата Сообщение от noname_club Посмотреть сообщение
Проверьте дейтвительно ли экзепмляр того класса вызываете.
вызываю экземпляр наследника.
но соединение инициализирую в родителе. может тут где то собака зарылась?
0
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;
}
Пытался так же тип явно преобразовать, всё равно возвращается экземпляр класса родителя.
Что я делаю не так?
0
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, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
1
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
28.10.2014, 07:59  [ТС] #12
Цитата Сообщение от glvrzzz Посмотреть сообщение
Ну так бред же написан. -init вызывается у уже созданного объекта с помощью +alloc, и он должен возвращать тот же указатель, что и +alloc (или nil, если все плохо). А у вас сначала создается экземпляр наследника, игнорируется, затем в ините создается новый экземпляр из сториборда, где скорее всего указан класс-родитель.
тогда как в ините мне загрузить экземпляр со сториборда правильно?
0
zulkis
682 / 609 / 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"];
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2014, 08:08
Привет! Вот еще темы с ответами:

.NET 4.x Покажите пример работы делегата для параметризованного метода - C#
Пересмотрел кучу примеров - но везде делегаты показаны без параметров. Покажите, пожалуйста, пример работы делегата для параметризованного...

Переопределение метода - Java SE
Добрый Вечер!!! Объясните Пожалуйста поподробнее, что обозначет: &quot;переопределение метода&quot; . Приведите Пожалуйста пример! Как связана...

Переопределение метода - C#
Не могу переопределить в производном классе метод Change, чтобы изменялось еще и грузоподъемность. using System; using...

Переопределение метода(класса) - Java SE
Задание: написать класс прогрессии в которой каждый следующий элемент равняется квадратному корню прошлого есть класс public class...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2014, 08:08
Ответ Создать тему
Опции темы

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