Цель-C: Как проверить, расширяется ли класс категорией? - PullRequest
2 голосов
/ 10 февраля 2011

В Java вы можете использовать instanceof, чтобы проверить, расширяет ли класс другой класс или реализует интерфейс.

В Objective-C вы можете использовать isKindOfClass, чтобы проверить, расширяет ли класс другой класс:

if ([myObject isKindOfClass:[AnClass class]]) { }

Но как я могу проверить, расширяется ли класс на категорию ?


РЕДАКТИРОВАТЬ 2

Мой код первого EDIT был, к сожалению, немного запутанным и бессмысленным, извините!Теперь вот мой новый код:

Я объясню всю проблему:
У меня есть класс ViewCustomerCreate, который расширяет UITableViewController.ViewCustomerCreate расширяется на категорию ICheckBox.Это мой код, который не работает:

- (void)closeModalView {
    UINavigationController *parent = (UINavigationController *)self.navigationController.parentViewController;
    UIViewController *parentViewContr = parent.topViewController;

    if ([parentViewContr isKindOfClass:[id<ICheckBox> class]]) { // ERROR-MESSAGE see below
        id<ICheckBox> parent2 = (id<ICheckBox>)parentViewContr; // works fine :-)
        [parent2 setSelectedElementId:checkedIndex]; // works fine :-)
    }   

    [self.navigationController dismissModalViewControllerAnimated:YES];
}

Сообщение об ошибке:" ошибка: 'id' не является именем класса Objective C или псевдонимом"

Я думаю, что я не могу использовать isKindOfClass , чтобы проверить, расширяется ли класс на категорию, не так ли?

PS: Что делатьЯ хочу?У меня есть общее модальное представление с флажками, и если я закрою это представление, родительское представление должно получить информацию о том, что выберет пользователь.


РЕДАКТИРОВАТЬ 3

OMG, ясмешанная категория с протоколом !!Аааааххххх ^^

РЕШЕНИЕ:

if ([parentViewContr conformsToProtocol:@protocol(ICheckBox)]) {

Ответы [ 2 ]

6 голосов
/ 10 февраля 2011

Нет способа проверить, расширяется ли класс категорией, но вы можете проверить, отвечает ли экземпляр определенному селектору:

- (BOOL)respondsToSelector:(SEL)sel;

В Objective-C вы должны беспокоитьсяменьше о том, что объект является , и больше беспокоиться о том, что объект может сделать .

Если он ходит как утка, звучит как утка и выглядит какДак, тогда он, вероятно, может летать, вы понимаете, о чем я?

Вы должны использовать это так:

if ([myObject respondsToSelector:@selector(myMethod:)])
{
    // do whatever you need to do
}

Просто небольшое замечание, поскольку вы упомянули интерфейсы Java.Вы можете проверить, реализует ли объект протокол (аналогично интерфейсам Java, но не совсем так), используя:

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
0 голосов
/ 10 февраля 2011

Если вы определили категорию в UIViewController, нет ни одного экземпляра UIViewController, к которому она не применяется.Следовательно, проверка во время выполнения не имеет смысла.

Давайте посмотрим на вашу реальную проблему:

parent.setMySpecialValue = 1; // DOES NOT WORK :-(

Что на самом деле означает «НЕ РАБОТАЕТ»?Вы получаете ошибку компилятора или ошибку во время выполнения.В первом случае есть несколько возможных проблем:

  1. Вы не включили заголовочный файл, содержащий категорию, в исходный файл, использующий этот метод
  2. Это свойство, которое вы назвали неправильно.Если свойство называется mySpecialValue, эта строка кода должна выглядеть следующим образом:

    parent.mySpecialValue = 1;
    

    или

    [parent setMySpecialValue: 1];
    

На данный момент категории не могут определять переменные экземпляраТаким образом, наличие синтезированного свойства может быть проблемой, поэтому это также может быть вашей проблемой, но вам нужно предоставить больше информации о том, что означает «НЕ РАБОТАЕТ».

...