Подтвердить что ты не робот

Могу ли я использовать метод класса в качестве обратного вызова делегата

В методе метода класса объявляю следующее:

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Hello" 
                                                   message:@"World"
                                                  delegate:self
                                         cancelButtonTitle:@"Cancel" 
                                         otherButtonTitles:@"Done", nil];

Теперь, хотя метод-метод является методом класса, компилятор не жалуется на delegate:self. Теперь, чтобы быть делегатом, я должен реализовать метод в протоколе UIAlertViewDelegate.

Теперь имеет значение, если метод является методом класса или нет, для того, чтобы вызываться, когда пользователь взаимодействует с моим AlertView?

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

4b9b3361

Ответ 1

Во-первых, я предполагаю, что с помощью "статических" методов вы подразумеваете методы класса (объявленные с помощью + вместо -).

"Компилятор не жалуется" о Objective-C не всегда много говорит вам. Все это на самом деле означает, что вы убедили компилятор, что все должно (или, по крайней мере, может) работать во время выполнения.

В конце концов, если объект, который вы предоставляете в качестве делегата, отвечает на правильные сообщения, компилятору все равно, что это класс (и не будет время выполнения). В этом случае вы предоставляете self метод класса. Как будто вы набрали [MyClass class].

Я думаю, что это, вероятно, вызывает сомнения в том, что вы должны делать, но это, вероятно, вне пределов вашего вопроса.

Ответ 2

Я хотел бы поделиться некоторыми из моих выводов:

  • Не имеет значения, объявляю ли я делегата следующим образом delegate:self или delegate:[MyClass class]

  • Однако, имеет значение, как я объявляю метод:

    Это работает

    +(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        // Some Actions here
    }
    

    Хотя следующий "синтаксис" является объявлением в протоколе UIAlertViewDelegate, он не работает:

    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
        // Some Actions here
    }
    

Ответ 3

Да, вы можете!!! Класс также является объектом.