I searched for answers like Get to UIViewController from UIView? and couple of other answers but was not successful.
My issue is that I have a button in UIView
lets say class1
and when I click on that button I want to load another view class2
which is UIViewController
, and as I don't get navigationController
in class1
I am unable to load the class2
view.
Please help me with this.
Thanks, In Advance.
In general UIViews
should not contain any logic that triggers the flow of app. This is the job of UIViewControllers
. It's just a way of making the design of your code better and more organized.
One way I often use is to use a delegate
pattern in my custom UIViews. Here is s simple setup:
In your MyCustomView .h file:
@class MyCustomView;
@protocol MyCustomViewDelegate <NSObject>
@optional
- (void)myViewDidTapOnButton:(MyCustomView)myCustomView;
@end
@interface MyCustomView : UIView
@property (weak, nonatomic) id <MyCustomViewDelegate> delegate;
@end
In your MyCustomView .m file:
- (IBAction)didTapMyButton:(id)sender {
if ([self.delegate respondsToSelector:@selector(myViewDidTapOnButton:)]) {
[self.delegate myViewDidTapOnButton:self];
}
}
Then in your viewcontroller, which is presenting your view:
interface:
@interface MyViewController ()<MyCustomViewDelegate>
@property (weak, nonatomic) IBOutlet UIView *myCustomView;
and implementation:
- (void)viewDidLoad {
[super viewDidLoad];
self.myCustomView.delegate = self;
}
- (void)myViewDidTapOnButton:(MyCustomView)myCustomView {
... code for presenting viewcontroller ...
}
Note : Even if you dont use the parameter myCustomView
which is sent in this method, its a common pattern and good habit to always send the sender
of the delegate as the first parameter.
This is also used a lot by Apple, eg in
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
Two cases :
If you are using storyboard then give your NavigationController a storyboard id. And create an object of navigationController
in your custom UIView
class.
If you have customized the app launching from AppDelegate
create a public property
of your navigationController
. From your UIView
class create an object of appDelegate with [UIApplication sharedApplication].delegate
. From this object access the navigationController property
When you have the navigationController
object you can push your viewcontroller with:
[navigationController pushViewController:ViewController animated:YES];
First fill storyboard ID with "MyViewController", which is a String field that you can use to create a new ViewController based on that storyboard ViewController. And later access that view controller like this:
- (IBAction)buttonPressed:(id)sender{
MyCustomViewController *newvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
[self presentViewController:newvc animated:YES completion:nil];
}
When you click your button,you can do this:
YouViewController *yourViewController = [YouViewController new];
[self.view addSubView:yourViewController.view];
Hope to help you.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.