ios objective-c xcode ios6 presentviewcontroller

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(...)