push a view controller from a UIView ios

2019-08-01 18:22发布

问题:

I have a navigation based application.On click of a button on the navigation bar in the first screen , I am able to push another view controller as follows :

 -(void) buttonClicked:(id)sender
{

    UIViewController*  mv = [[SecondViewController alloc] init];

    [[self navigationController] pushViewController:mv animated:YES];  

}

Now i have a UIView(separate .h and .m files) as part of the first screen. On click of a button in the UIView, i want to push the SecondViewController. I have tried the following :

 UIViewController*  mv = [[SecondViewController alloc] init];
 UIViewController * home=[[FirstViewController alloc]init];
 [[home navigationController] pushViewController:mv animated:YES];

It doesnt work!! Kindly help

回答1:

UIViewController*  mv = [[SecondViewController alloc] init];
UIViewController * home=[[FirstViewController alloc]init];
[[home navigationController] pushViewController:mv animated:YES];

The problem here is that home isn't part of the navigation stack, so [home navigationController] is surely nil. I'm not quite clear on what you're trying to do here, but just creating a view controller doesn't mean that it's actually part of the view controller graph.



回答2:

Why would it work? Randomly creating view controllers whose view is not even visible, is not the solution. You can either keep a reference to the VC in the view like this:

@imlementation ViewController

- (id) init
{
    // ...
    aView = [[CustomView alloc] init];
    aView.viewController = self;
    // ...
}

@end

@interface CustomView

@property (assign) ViewController *viewController;

@end

Or you can search the responder chain at runtime:

UIResponder *next = [view nextResponder];
while (next)
{
    if ([next isKindOfClass:[ViewController class]])
    {
        break;
    }
    next = [next nextResponder];
}

And now "next" will contain the view controller (or nil if it can't be found).



回答3:

Try using the same navigationController to push view, this keeps the same stack of ViewControllers.

UIViewController*  mv = [[SecondViewController alloc] init];
[[self navigationController] pushViewController:mv animated:YES]; 

[mv release];


回答4:

I see your problem now! You need to #import your FirstViewController, then @class it. Then do your push.

So:

//.h 
#import "FirstViewContoller.h"

@class FirstViewController;

@interface...

//.m

-(void)return {
FirstViewController *firstview = [[FirstViewController alloc]init(withnibname:)];
[firstView.navigationController pushViewController: firstView.navigationController.topViewController animated: TRUE];
}


回答5:

If I am not wrong, your UIView though is in separate files, is still added to the screen from a UIViewController class.

Simply, post a notification from UIView to your FirstViewController class where you have access to the navigation controller. Then push the SecondViewController from there.



回答6:

You Can use this. It Works very well for me:-

Firstly Create Object of AppDelegate in UIView Class and initialize it. Then create Navigationcontroller object in Appdelegate.h :-

@property(strong,nonatomic) UINavigationController *navControl;

In your UIView Class implement this code where you want to push :-

ViewController *objview = [[ViewController alloc]init]; [appDelegate.navControl pushViewController:objview animated:YES];