Навигация между несколькими представлениями в iphone - PullRequest
0 голосов
/ 13 января 2012

Привет, у меня три взгляда, и я хотел бы добиться чего-то, что не работает. У меня есть главное представление, если пользователь нажимает определенную кнопку, код проверяет, зарегистрирован он или нет: если да, его отправляют непосредственно на просмотр B, если не сначала, он переходит на просмотр входа в систему. После успешного входа в систему у меня есть этот код для просмотра b:

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];

Дело в том, что я хотел бы избавиться от вида входа в систему, потому что он отображается там под плюсом, если пользователь нажимает назад, он возвращается к входу в систему, но если я добавляю:

[self.view removeFromSuperview];

до или после [self.view addSubview:incidencias.view], я просто перенаправлен на главный экран;

Я не знаю, объяснил ли я сам четко, но, например, в Android вы можете просто позвонить в финиш, а затем вызвать следующее действие, и действие входа в систему исчезает, но здесь, в iphone, я не знаю, что делать.

Я нашел другое решение - добавлять оба представления один за другим, но это не очень хорошо работает:

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

    login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];

это не работает, потому что incidencias запускается и не ждет завершения входа в систему.

спасибо

РЕДАКТИРОВАТЬ: благодаря BeOn я изменил свой код, добавив протокол: LoginViewControllerDelegate и этот метод внутри viewController:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
[viewController.view removeFromSuperview];

incidencias =[[MisIncidencias alloc]
              initWithNibName:@"MisIncidencias"
              bundle:nil];

[self.view addSubview:incidencias.view];
}

в LoginViewController у меня есть

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:  (NSInteger)buttonIndex{

if(self.delegate)
    [self.delegate loginSucceededFromController:self]

} он получает ошибку: Семантическая проблема: свойство «делегат» не найдено для объекта типа «LoginViewController *»

Если вход в систему успешен, пользователь видит предупреждение, и когда он нажимает кнопку ОК, вызывается указанный выше метод.

что еще мне добавить? Я начинаю с iphone, и я не очень хорошо понимаю, что такое делегат (я из Явы)

Ответы [ 3 ]

1 голос
/ 13 января 2012

Ах, хорошо, это не так уж плохо. Вот первое решение, которое приходит на ум:

Шаг 1. Создайте протокол делегата для вашего вида входа в систему.

@protocol LoginViewControllerDelegate <NSObject>
@required
- (void)loginSucceededFromController:(LoginViewController*)viewController;
@end

Шаг 2. Реализация протокола в вашем главном контроллере вида

- (void)loginSucceededFromController:(LoginViewController*)viewController {
// TODO: we'll put something here in a second
}

Шаг 3. Вызовите метод делегата из вашего вида входа в систему при успешном входе в систему

if (loginSuccess && self.delegate) {
    [self.delegate loginSucceededFromController:self]
}

Шаг 4. Отключите представление входа в систему и представьте новое представление из контроллера основного представления, используя уже имеющийся код:

- (void)loginSucceededFromController:(LoginViewController*)viewController {
    [viewController.view removeFromSuperview];

    incidencias =[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil];

    [self.view addSubview:incidencias.view];
}

Надеюсь, это кое-что прояснит. Причина, по которой у вас возникли проблемы, заключается в том, что вы добавляете подпредставление в представление, затем сразу удаляете представление или удаляете представление, а затем добавляете в него подпредставление. В приведенном выше коде вы вызываете делегат контроллера представления, и делегат, которому принадлежит суперпредставление представления, сначала удаляет представление, а затем добавляет новый вид (из-за отсутствия лучшего термина) к суперпредставлению. Поскольку суперпредставление никогда не удалялось, оно может показать ваш новый вид.

0 голосов
/ 13 января 2012

Если вы хотите, чтобы что-то работало сразу, и вы используете uinavigationcontroller ... тогда вы, возможно, можете использовать

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

, просто получите изменяемую копию массива self.navigationController.viewcontrollers, popпоследний элемент, который будет экраном входа в систему, и нажмите новый экран, на который вы планируете переместить экран b .. и передать массив этой функции ... и теперь вы в безопасности!

0 голосов
/ 13 января 2012

Вы должны взять BOOL, к которому можно получить доступ через наше приложение, например global

как extern BOOL login; теперь, когда вы входите, установите YES. Теперь проверьте, когда

if(login == YES){

incidencias=[[MisIncidencias alloc]
                  initWithNibName:@"MisIncidencias"
                  bundle:nil
                  ];

    [self.view addSubview:incidencias.view];

}
else{
login=[[LoginViewController alloc]
                  initWithNibName:@"LoginViewController"
                  bundle:nil];
    [self.view addSubview:login.view];
}
...