2011-12-24 1 views
2

대리인 메서드를 사용하여 다른보기로보기를 푸시하려고합니다. 이 메서드는 경우에만 작동하며이 코드가 [button addTarget:self action:@selector(pushView:) forControlEvents:UIControlEventTouchUpInside];[button addTarget:delegate action:@selector(pushViewController:) forControlEvents:UIControlEventTouchUpInside];으로 변경되면 대리자에 대해 null을 반환하지 않습니다. 그렇지 않으면 델리게이트가 null을 반환합니다. 나는 이것이 ViewController의 ContentViewController를 유지하지 않는 ARC의 문제라고 생각한다. 도와주세요!사용자 지정 대리자는 UIButton 선택기에서 직접 호출 한 경우에만 작동합니다. ARC 유지 문제

참고 : 나는 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

+0

이 ViewController 및 ContentViewController를 어떻게 표현하고 있습니까? 그리고 네비게이션 컨트롤러의 루트보기 컨트롤러가 있어야하나요? –

+0

탐색 컨트롤러의 루트보기는 "FirstViewController"입니다 (여기서는 표시되지 않았습니다). ContentViewController는 "ViewController"에 대한 하위보기로 추가 된 "사용자 지정"모달보기로 표시됩니다. 더 많은 것을보고 싶다면 알려주세요. – morcutt

+0

AppDelegate에 대한 참조가 있습니다. 하나의 뷰 템플릿으로 시작하여 네비게이션 컨트롤러를 제공된 "ViewController"에 추가했습니다. View Controller에는 루트 뷰가 "FirstViewController"인 NavigationController가 있습니다. "ViewController"는 "ContentViewController"(인스턴스 메서드가 호출 될 때)를 서브 뷰로 표시하고 ViewController (FirstViewController에 대해 볼 수는 있지만 여기서는 내 문제를 해결할 수 없다고 생각합니다)를 ContentViewController에서 푸시하려고 시도하고 있습니다. 뷰 계층 구조를 설명하기 위해 그림을 업로드합니다. – morcutt

답변

0

사용자 지정 대리자 대신 NSNotificationcenter를 사용하여 종료되었습니다. 도와 줘서 고마워.

편집 : 새로운 iOS5 UIViewController 포함을 사용하도록 애플리케이션이 변경되었습니다. 훨씬 낫다!