Пользовательский делегат работает, только если напрямую вызывается из селектора UIButton. ARC сохраняет проблему - PullRequest
2 голосов
/ 24 декабря 2011

Я пытаюсь использовать метод делегата, чтобы переместить представление в другое представление. Метод работает и не возвращает ноль для делегата, когда этот код: [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];
}

Редактировать: Это изображение должно помочь объяснить иерархию представления и то, что я здесь делаю. enter image description here

1 Ответ

0 голосов
/ 24 декабря 2011

Завершено использованием NSNotificationcenter вместо пользовательского делегата.Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Изменил мое приложение для использования нового iOS5 UIViewController Containment.Гораздо лучше!

...