Использование одного и того же указателя для указания на разные UIViewControllers - PullRequest
2 голосов
/ 15 апреля 2011

Может быть, я пытаюсь подойти к этому неправильно ...

В моем контроллере основного вида у меня есть три кнопки. Каждая кнопка вызывает загрузку другого UIViewController и его пера.

Я использую один метод для работы с касаниями кнопок:

-(IBAction)touched_menu_button:(id)sender
{
SEL selector;

UIButton *button = (UIButton *)sender;

switch (button.tag) 
{
    case 0:
        selector = @selector(ShowA:finished:context:);
        break;

    case 1:
        selector = @selector(ShowB:finished:context:);
        break;

    case 2:
        selector = @selector(ShowC:finished:context:);
        break;

    default:
        selector = @selector(ShowA:finished:context:);
        break;
}

[self FadeOut:selector];
}

Что здесь происходит, так это то, что я запускаю небольшую анимацию, прежде чем на самом деле появится новый вид. Я вызываю «FadeOut» с помощью селектора, который вызовет метод, который покажет соответствующий вид после завершения анимации. Это отлично работает. Процедуры, вызываемые селекторами, выглядят так:

-(void)ShowA:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    A_ViewController *mvc = [[[A_ViewController alloc] init] autorelease];
    mvc.delegate = self;
    [self presentModalViewController:mvc animated:FALSE];
}

Это тоже отлично работает.

Что я хотел бы сделать, так это свести это к одному методу, вызываемому селектором, и поместить весь избыточный код в мой метод "touched_menu_button". Тогда функция обратного вызова будет выглядеть так:

-(void)ShowNewView:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    [self presentModalViewController:mvc animated:FALSE];
}

Очевидно, это требует передачи другого подкласса UIViewController в "mvc" в зависимости от того, какое представление я хочу показать. И вот тут я столкнулся с неприятностями. Может быть, это то, что я программирую 12 часов подряд, и я мысленно жарен, но я не могу понять, как это сделать. Я попытался определить переменные класса как void , void *, id, UIViewController * и UIViewController **. По какой-то причине я не могу заставить его работать.

Я должен отметить, что ряд подходов работает, однако они сталкиваются с проблемами, когда представление отклоняется и происходит процесс автоматического выпуска. Кажется, что мне не удается передать адрес указателя на подкласс UITableView во всех перестановках, которые я пробовал. Единственный вариант, который я могу определить прямо сейчас, действительно ужасен.

1 Ответ

1 голос
/ 15 апреля 2011

Вместо передачи объекта в функцию обратного вызова, вы можете передать сам класс.

-(IBAction)touched_menu_button:(id)sender {
    Class theClass;

    UIButton *button = (UIButton *)sender;

    switch (button.tag) {
        case 0:
            theClass = [A_ViewController class];
            break;

        case 1:
            theClass = [B_ViewController class];
            break;

        case 2:
            theClass = [C_ViewController class];
            break;

        default:
            theClass = [A_ViewController class];
            break;
    }

    [self FadeOut:theClass];
}

FadeOut: затем использует класс в качестве контекстной информации анимации:

- (void)FadeOut:(Class)theClass {
    //...
    [UIView beginAnimations:@"FadeOut" context:(void*)theClass];
    //...
    [UIView commitAnimations];
    //...
 }

Если вы используете контекст для чего-то другого, вы можете использовать переменную, так как кажется, что вы пытаетесь сделать это с объектом контроллера представления. Затем обратный вызов выделяет класс, который ему дан.

-(void)ShowA:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    Class theClass = (Class)context; // or get it from a variable if you don't use the context
    // If the view controllers all have a shared superclass which declares the delegate property, you can specify that as the type and use dot notation, but otherwise you will need to call setDelegate:
    UIViewController *mvc = [[[theClass alloc] init] autorelease];
    [mvc setDelegate:self];
    [self presentModalViewController:mvc animated:FALSE];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...