Я пытаюсь использовать метод делегата, чтобы переместить представление в другое представление. Метод работает и не возвращает ноль для делегата, когда этот код: [button addTarget:self action:@selector(pushView:) forControlEvents:UIControlEventTouchUpInside];
изменяется на [button addTarget:delegate action:@selector(pushViewController:) forControlEvents:UIControlEventTouchUpInside];
. В противном случае делегат возвращает ноль. Я считаю, что это проблема с ARC, не сохраняющим ContentViewController в ViewController. Пожалуйста, помогите!
Примечание: я использую ARC
ContentViewController
@class ContentViewController;
@protocol ContentViewControllerDelegate <NSObject>
@required
-(void)pushViewController:(UIViewController *)viewController;
@end
@interface ContentViewController : UIViewController
{
__weak id <ContentViewControllerDelegate> delegate;
}
@property (weak) __weak id <ContentViewControllerDelegate> delegate;
- (void)pushView:(UIViewController *)viewController;
@end
**ContentViewController.m**
#import "ContentViewController.h"
@implementation ContentViewController
@synthesize delegate;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 300, 250, 30);
button.backgroundColor = [UIColor grayColor];
[button setTitle:@"Test Button" forState:UIControlStateNormal];
[button addTarget:self action:@selector(pushView:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)pushView:(UIViewController *)viewController
{
if([delegate respondsToSelector:@selector(pushViewController:)])
[delegate pushViewController:viewController];
NSLog(@"pushView");
}
ViewController
#import "ContentViewController.h"
@interface ViewController : UIViewController <ContentViewControllerDelegate>
{
IBOutlet UINavigationController *navigationController;
__weak IBOutlet UIButton *navigationButton;
}
@property (strong, nonatomic) IBOutlet UINavigationController *navigationController;
@property (strong, nonatomic) ContentViewController *contentViewController;
@end
#import "ViewController.h"
#import "BinViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation ViewController
@synthesize navigationController;
@synthesize contentViewController;
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Add the navigationController and set the frame
self.navigationController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:navigationController.view];
// Init ContentViewController to set the delegate
contentViewController = [[ContentViewController alloc] init];
// Set the delegate
contentViewController.delegate = self;
}
#pragma mark - ContentViewControllerDelegate Methods
-(void)pushViewController:(UIViewController *)viewController
{
// This is here just to see if this instance method work ... I haven't actually sent it a view to push
BinViewController *binViewController = [[BinViewController alloc] init];
[self.navigationController pushViewController:binViewController animated:YES];
}
Редактировать: Это изображение должно помочь объяснить иерархию представления и то, что я здесь делаю.