대리인 메서드를 사용하여 다른보기로보기를 푸시하려고합니다. 이 메서드는 경우에만 작동하며이 코드가 [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];
}
편집을 사용하고 있습니다 :이 이미지는 뷰 계층을 설명해야하며, 내가 여기서 뭘하고 있는지.
이 ViewController 및 ContentViewController를 어떻게 표현하고 있습니까? 그리고 네비게이션 컨트롤러의 루트보기 컨트롤러가 있어야하나요? –
탐색 컨트롤러의 루트보기는 "FirstViewController"입니다 (여기서는 표시되지 않았습니다). ContentViewController는 "ViewController"에 대한 하위보기로 추가 된 "사용자 지정"모달보기로 표시됩니다. 더 많은 것을보고 싶다면 알려주세요. – morcutt
AppDelegate에 대한 참조가 있습니다. 하나의 뷰 템플릿으로 시작하여 네비게이션 컨트롤러를 제공된 "ViewController"에 추가했습니다. View Controller에는 루트 뷰가 "FirstViewController"인 NavigationController가 있습니다. "ViewController"는 "ContentViewController"(인스턴스 메서드가 호출 될 때)를 서브 뷰로 표시하고 ViewController (FirstViewController에 대해 볼 수는 있지만 여기서는 내 문제를 해결할 수 없다고 생각합니다)를 ContentViewController에서 푸시하려고 시도하고 있습니다. 뷰 계층 구조를 설명하기 위해 그림을 업로드합니다. – morcutt