ios - Uso de presentViewController desde UIView
objective-c xcode (4)
Solo UIViewController puede presentar otro controlador de vista, por lo que si necesita mostrar viewcontroller view de varias maneras, una de ellas es como esta:
hacer que un viewcontroller en el que su vista padre se encuentra un delegado de ella
ParentView *view = [ParentView new];
...
view.delegate = self;
luego, dentro del método de llamada ParentView de ese delegado
- (IBAction)homeButtonPressed:(id)sender {
[self.delegate buttonPressed];
}
y luego, dentro de su instrumento VC
-(void)buttonPressed {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentViewController:vc animated:NO completion:NULL];
}
Si necesita mantener este código dentro de UIView y evitar la delegación, puede hacer un truco como este (personalmente no me gusta, pero debería funcionar)
-(void)buttonPressed{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[(UIViewController*)self.nextResonder presentViewController:vc animated:NO completion:NULL];
}
Estoy creando una barra de título para mi aplicación iOS y estoy haciendo esto dentro de UIView. El único problema que estoy teniendo es con el "botón de inicio". Cuando se presiona el botón de inicio, debe ir a la página de inicio, que es ViewController.
Sin embargo, no parece que [self presentViewController:vc animated:NO completion:NULL];
trabaja para UIView.
¿Cómo puedo solucionar este problema?
- (void) createTitlebar {
CGRect titleBarFrame = CGRectMake(0, 0, 320, 55);
//Create the home button on the top right of the page. When clicked, it will navigate to the home page of the application
homeButton = [UIButton buttonWithType:UIButtonTypeCustom];
homeButton.frame = CGRectMake(275, 10, 40, 40);
[homeButton setTag:1];
[homeButton setImage:[UIImage imageNamed:@"homeIcon.png"] forState:UIControlStateNormal];
[homeButton addTarget:self action:@selector(homeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:homeButton];
}
- (IBAction)homeButtonPressed:(id)sender{
//Transition to the submit button page
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentViewController:vc animated:NO completion:NULL];
}
Puedes probar el código a continuación
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UIViewController *vc1 = [UIApplication sharedApplication].keyWindow.rootViewController;
[vc1 presentViewController:vc animated:YES completion:nil];
Puede hacer esto sin usar el patrón de delegado. Aqui tienes
C objetivo
UIViewController *currentTopVC = [self currentTopViewController];
currentTopVC.presentViewController.........
- (UIViewController *)currentTopViewController {
UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
while (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}
return topVC;
}
Rápido
var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
topVC?.presentViewController........
Aquí hay una versión más idiomática de Swift 3 de la respuesta de Shamsudheen:
extension UIApplication {
static func topViewController() -> UIViewController? {
guard var top = shared.keyWindow?.rootViewController else {
return nil
}
while let next = top.presentedViewController {
top = next
}
return top
}
}
Entonces solo puedes llamar:
UIApplication.topViewController()?.present(...)