Динамически установленный указатель UIViewController, встроенный - Цель C - PullRequest
0 голосов
/ 26 июня 2018

У меня есть приложение для iOS с циклом for, которое создает, настраивает и добавляет пользовательский контроллер представления в мое представление.Проблема в том, что мне нужно динамически установить для объекта UIViewController правильный класс, в зависимости от номера текущего цикла.Вот мой код:

// Loop through the data and setup the switches.

for (NSUInteger loop = 0; loop < [switchLabels count]; loop++) {

    // Create the view controller object.
    UIViewController *screen;

    // Create the custom switch view.

    if (loop < 3) {
        screen = [[CustomSwitchView alloc] initWithNibName:@"CustomSwitchView" bundle:nil];
    } else {
        screen = [[CustomTripleSwitchView alloc] initWithNibName:@"CustomTripleSwitchView" bundle:nil];
    }

    // Create the custom switch view.
    [screen setPassedInType:switchTypes[loop]];
    [screen setDelegate:self];
    [self addChildViewController:screen];
    [screen.view setFrame:CGRectMake((self.view.frame.size.width - 150), ((UILabel *)switchLabels[loop]).frame.origin.y, 144, 72)];
    [scrollTopView addSubview:screen.view];
    [screen didMoveToParentViewController:self];
    [screen setTitles:switchTitles[loop] state:[switchSettings[loop] boolValue]];
}

Проблема в том, что некоторые из приведенных выше вызовов методов приводят к ошибке:

Нет видимого @interface для 'UIViewController' объявляет селектор....

Чтобы решить эту проблему, мне нужно набрать объект cast screen.Однако мне нужно динамически набрать приведение типа, основываясь на номере цикла for:

Если цикл меньше 3, мне нужно набрать приведение объекта к CustomSwitchView, в противном случае мне нужно набрать приведение типаCustomTripleSwitchView.Как я могу сделать это inline?Например, я попробовал приведенный ниже код, но он не сработал:

(loop < 3 ? (CustomSwitchView *) : (CustomTripleSwitchView *))

Спасибо за ваше время, Дэн.

1 Ответ

0 голосов
/ 26 июня 2018

Есть несколько способов справиться с этим.Наименьшее влияние на существующий код будет иметь различие между методами, которые применяются в общем случае к UIViewControllers и теми, которые относятся к подклассам.Вызвать методы подкласса для переменных стека, которые объявлены как определенный подкласс ...

for (NSUInteger loop = 0; loop < [switchLabels count]; loop++) {

    // Create the view controller object.
    UIViewController *vc;

    // Create the custom switch view.

    if (loop < 3) {
        CustomSwitchView *screen = [[CustomSwitchView alloc] initWithNibName:@"CustomSwitchView" bundle:nil];
        [screen setPassedInType:switchTypes[loop]];
        [screen setDelegate:self];
        [screen setTitles:switchTitles[loop] state:[switchSettings[loop] boolValue]];
        vc = screen;
    } else {
        CustomTripleSwitchView *screen = [[CustomTripleSwitchView alloc] initWithNibName:@"CustomTripleSwitchView" bundle:nil];
        [screen setPassedInType:switchTypes[loop]];
        [screen setDelegate:self];
        [screen setTitles:switchTitles[loop] state:[switchSettings[loop] boolValue]];
        vc = screen;
    }

    // Create the custom switch view.
    [self addChildViewController:vc];
    [vc.view setFrame:CGRectMake((self.view.frame.size.width - 150), ((UILabel *)switchLabels[loop]).frame.origin.y, 144, 72)];
    [scrollTopView addSubview:vc.view];
    [vc didMoveToParentViewController:self];
}

Это нормальное решение, если мы закончили сталкиваться с этой проблемой в проекте.Когда вы видите, что такие вещи распространяются, пришло время задуматься: (а) я должен определить протокол для каждого класса (как метко предложил комментатор), или (б) действительно ли эти подклассы связаны друг с другом, например, CustomTripleSwitchView действительно подкласс CustomSwitchView?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...