Iphone 自定义委托仅在从UIButton选择器直接调用时有效
我正在尝试使用委托方法将一个视图推送到另一个视图。此方法仅在以下代码时有效,并且不会为委托返回null:Iphone 自定义委托仅在从UIButton选择器直接调用时有效,iphone,objective-c,ios,delegates,automatic-ref-counting,Iphone,Objective C,Ios,Delegates,Automatic Ref Counting,我正在尝试使用委托方法将一个视图推送到另一个视图。此方法仅在以下代码时有效,并且不会为委托返回null:[按钮添加目标:自我操作:@selector(pushView:)forControlEvents:UIControlEventTouchUpInside]更改为[按钮添加目标:委托操作:@selector(pushViewController:)forControlEvents:UIControlEventTouchUpInside]。否则,委托将返回null。我认为这是ARC没有在View
[按钮添加目标:自我操作:@selector(pushView:)forControlEvents:UIControlEventTouchUpInside]代码>更改为[按钮添加目标:委托操作:@selector(pushViewController:)forControlEvents:UIControlEventTouchUpInside]代码>。否则,委托将返回null。我认为这是ARC没有在ViewController中保留ContentViewController的问题。请帮忙
注意:我使用的是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");
}
#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];
}
@class ContentViewController;
@协议内容ViewControllerDelegate
@必需的
-(void)pushViewController:(UIViewController*)viewController;
@结束
@接口ContentViewController:UIViewController
{
__弱id委托;
}
@属性(弱)\弱id委托;
-(void)pushView:(UIViewController*)viewController;
@结束
**ContentViewController.m**
#导入“ContentViewController.h”
@ContentViewController的实现
@综合代表;
//实现viewDidLoad以在加载视图(通常从nib)后执行附加设置。
-(无效)viewDidLoad
{
[超级视图下载];
UIButton*button=[UIButton button类型:UIButtonTypeCustom];
button.frame=CGRectMake(0,300,250,30);
button.backgroundColor=[UIColor grayColor];
[按钮设置标题:@“测试按钮”用于状态:uicontrol状态正常];
[按钮添加目标:自操作:@选择器(pushView:)用于控制事件:UIControlEventTouchUpInside];
[self.view addSubview:按钮];
}
-(无效)pushView:(UIViewController*)viewController
{
if([delegate respondsToSelector:@selector(pushViewController:)]))
[代理pushViewController:viewController];
NSLog(“pushView”);
}
视图控制器
@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");
}
#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];
}
#导入“ContentViewController.h”
@界面ViewController:UIViewController
{
IBuinavigationController*导航控制器;
__弱IBUIButton*导航按钮;
}
@属性(强,非原子)IBuinavigationController*导航控制器;
@属性(强,非原子)ContentViewController*ContentViewController;
@结束
#导入“ViewController.h”
#导入“BinViewController.h”
#进口
@实现视图控制器
@综合导航控制器;
@综合内容控制器;
#pragma标记-视图生命周期
-(无效)viewDidLoad
{
[超级视图下载];
//添加navigationController并设置框架
self.navigationController.view.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
[self.view addSubview:navigationController.view];
//初始化ContentViewController以设置委托
contentViewController=[[contentViewController alloc]init];
//设置代理
contentViewController.delegate=self;
}
#pragma标记-ContentViewControllerDelegate方法
-(无效)pushViewController:(UIViewController*)viewController
{
//这里只是想看看这个实例方法是否有效……我实际上还没有向它发送一个视图来推送
BinViewController*BinViewController=[[BinViewController alloc]init];
[self.navigationController pushViewController:binViewController动画:是];
}
编辑:这张图片应该有助于解释视图层次结构和我在这里做的事情。
最终使用了NSNotificationcenter而不是自定义委托。谢谢你的帮助
编辑:将我的应用程序更改为使用新的iOS5 UIViewController容器。好多了 最终使用NSNotificationcenter而不是自定义委托。谢谢你的帮助
编辑:将我的应用程序更改为使用新的iOS5 UIViewController容器。好多了 您如何演示此ViewController和ContentViewController?哪个应该是导航控制器的根视图控制器?导航控制器的根视图是“FirstViewController”(我在这里没有显示)。ContentViewController显示在“自定义”模式视图中,作为“ViewController”的子视图添加。如果您需要了解更多信息,请告诉我。AppDelegate已引用该信息。我从一个视图模板开始,并将导航控制器添加到提供的“ViewController”中。视图控制器有一个根视图为“FirstViewController”的NavigationController。“ViewController”将“ContentViewController”(当调用实例方法时)显示为子视图,我正试图从ContentViewController将视图推送到ViewController(我可以将视图推送到FirstViewController,但我认为这不会解决我的问题)。我将上传一张图片来解释视图层次结构。您尚未说明如何推送contentviewcontroller。我们可以看到您创建了一个新的实例,并分配了代理,但是您实际上什么时候将其放在屏幕上?我怀疑你放在屏幕上的是另一个实例,你没有设置委托。我从来没有推过它。我相信我说过我用我创建的自定义模态视图实例添加它。我将其添加为ViewController的子视图,这样它就可以占据整个屏幕并具有透明的背景。想想Flipboard iPad应用程序“导航浏览器”,它可以在整个视图上滑动。该视图是我的“ContentViewController”。我知道我可以使用标准模式视图将样式设置为uimodalpresentationcurrentcontext,但这并不是我想要的方式。您如何显示此ViewController和ContentViewController?哪个应该是导航控制器的根视图控制器?导航控制器的根视图是“FirstViewController”(我在这里没有显示)。ContentViewController显示在“自定义”模式视图中,作为“ViewController”的子视图添加。如果你需要看