Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 自定义委托仅在从UIButton选择器直接调用时有效_Iphone_Objective C_Ios_Delegates_Automatic Ref Counting - Fatal编程技术网

Iphone 自定义委托仅在从UIButton选择器直接调用时有效

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

我正在尝试使用委托方法将一个视图推送到另一个视图。此方法仅在以下代码时有效,并且不会为委托返回null:
[按钮添加目标:自我操作:@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”的子视图添加。如果你需要看