iosobjective-cxcodeios6presentviewcontroller

Using presentViewController from UIView


I am creating a title bar for my iOS application and I am making this inside a UIView. The only issue I am having is with the "home button". When the home button is pressed, it needs to go to the home page, which is ViewController.

However, it doesn't look as if [self presentViewController:vc animated:NO completion:NULL]; works for UIView.

How do I work around this problem ?

- (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];
}

Solution

  • Only UIViewController can present another view controller, so if you need to show a viewcontroller from view there are several way, one of them is like this:

    make a viewcontroller on which your parent view is situated a delegate of it

    ParentView *view = [ParentView new];
    ...
    view.delegate = self;
    

    then, inside ParentView call method of that delegate

    - (IBAction)homeButtonPressed:(id)sender {
        [self.delegate buttonPressed];
    }
    

    and then, inside your VC implement

     -(void)buttonPressed {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
        [vc setModalPresentationStyle:UIModalPresentationFullScreen];
        [self presentViewController:vc animated:NO completion:NULL];
    }
    

    If you need to keep this code inside UIView and avoid delegation you can do a trick like this (personally i don't like it but it should work)

    -(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];
    }