Методы делегатов не запущены - PullRequest
0 голосов
/ 27 апреля 2011

Любые проблемы, о которых я могу думать, проверены, но методы делегата все равно не сработают. Я объявил протокол под названием SocketDelegate в Socket.h:

@protocol SocketDelegate <NSObject>
@optional
- (void)socket:(Socket *)socket handleNewConnection:(NSString *)test;
- (void)socket:(Socket *)socket didSend:(BOOL)didSend;
- (void)socket:(Socket *)socket didReceive:(BOOL)didReceive;
@end

@interface Socket : NSObject {
    id<SocketDelegate> delegate;
}

@property(nonatomic,assign) id<SocketDelegate> delegate;

@end

Теперь, в Socket.m, делегат уведомляется об успехе / ошибке отправленного / полученного файла:

@implementation Socket

/* I checked: both of these methods are called */

- (void)stopSendWithStatus:(NSString *)statusString {
    [self.delegate socket:self didSend:isSent];
}

- (void)stopReceiveWithStatus:(NSString *)statusString {
    [self.delegate socket:self didReceive:isReceived];
}

@end

ViewController.h соответствует делегату:

@interface ViewController : UIViewController <SocketDelegate>

и в ViewController.m я назначил делегата через класс NetController, который связывает Socket и ViewController вместе. и я реализую методы делегата:

@implementation ViewController

- (void)viewDidLoad {
    /* I checked: this method is called */
    /* Both 'netController' and 'socket' are initialized correctly
    netController = [[NetController alloc] init];
    [[netController socket] setDelegate:self];  
}

@end

@implementation ViewController (SocketDelegate)

- (void)socket:(Socket *)socket didSend:(BOOL)didSend {
    NSLog(@"didSend %@", didSend);        // Nothing happens...
}

- (void)socket:(Socket *)socket didReceive:(BOOL)didReceive {
    NSLog(@"didReceive %@", didReceive);  // Nothing happens...
}

@end

Кроме того, я попытался установить делегат в других местах, кроме viewDidLoad, внутри ViewController.m, но это не имеет никакого эффекта. Конечно, у меня нет ошибок компилятора и ошибок времени выполнения ... Что не так в моем коде?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

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

0 голосов
/ 27 апреля 2011

Вы уверены, что -viewDidLoad называется?Ваш ViewController класс не наследует ни от чего, я думаю, вы хотите сделать:

@interface ViewController : UIViewController <SocketDelegate>

Убедитесь, что -viewDidLoad вызван, если нет, он, вероятно, не был подключен в NIBфайл или создан программно.Следующим шагом убедитесь, что функции сокета пытаются вызвать функции делегата.Кроме того, класс Socket также ничего не наследует, я не знаю, как вы строите свой сокет внутри netController, но мне пришлось изменить его на

@interface Socket : NSObject

, чтобы иметь возможность создаватьобъект.Убедитесь, что объект сокета внутри netController правильно построен.Помните, что если они равны нулю, никакие предупреждения не будут выдаваться при попытке отправить им сообщения.

Исправление всех этих вещей, это работало для меня.

...