self.delegate总是无

时间:2016-09-12 10:06:39

标签: ios objective-c delegates

我看到了类似的问题。在所有地方,他们说使用className.delegate = self或其他类似的解决方案。但我已经检查过我已经做好了一切。然后我也面临self.delegate是零问题。

我正在尝试将数据从MyViewController传递到Button Click

上的NextViewController

我做了,

1.MregController中的处理协议

2.在MyViewController中处理委托实例

3.在Button Click Event

中写了这段代码
-(void)buttnPressed:(id)s{

    NextViewController* d=[[NextViewController alloc]init];

    if(self.delegate){
        NSLog(@"D");
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(groupSelected:)]) {
        [self.delegate groupSelected:@"df"];
    }
    [self.navigationController pushViewController:d animated:YES];
}

4.在NextViewController中实现FirstViewController并设置它的委托 5.Created FirstViewController的实例(在NextVC内)并使用该实例我将它的委托设置为self 6.在NextVC中实现了委托方法

我根据自己的知识做了一切,但我没有得到解决方案。请帮忙。谢谢你的时间。 (:

这是我的代码

MyViewController.h

#import <UIKit/UIKit.h>


@protocol WatchListDelegate <NSObject>

-(void)groupSelected:(NSString *)grouDetails;

@end


@interface MyViewController : UIViewController
@property (strong,nonatomic) id<WatchListDelegate> delegate;

@end

MyViewController.m

#import "MyViewController.h"
#import "NextViewController.h"

@interface MyViewController ()
@property UIButton *buttonPopUp;
@end

@implementation MyViewController

-(id)init{
    self = [super init];
    return self;
}

-(void)loadView{
   [super loadView];
    self.buttonPopUp=[UIButton buttonWithType:UIButtonTypeCustom];
    [self.buttonPopUp addTarget:self
                         action:@selector(buttnPressed:)
               forControlEvents:UIControlEventTouchUpInside];
    [self.buttonPopUp setTitle:@"Press ME" forState:UIControlStateNormal];
    [self.buttonPopUp setBackgroundColor:[UIColor blueColor]];
    self.buttonPopUp.frame=CGRectMake(80,180,80,40);
    [self.view addSubview:self.buttonPopUp];
}


-(void)buttnPressed:(id)s{

    if(self.delegate){
        NSLog(@"D");
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(groupSelected:)]) {
        [self.delegate groupSelected:@"df"];
    }
    NextViewController* d=[[NextViewController alloc]init];
    [self.navigationController pushViewController:d animated:YES];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
@end

NextViewController.h

#import <UIKit/UIKit.h>
#import "MyViewController.h"

@interface NextViewController : UIViewController<WatchListDelegate>

@end

NextViewController.m

#import "NextViewController.h"

@interface NextViewController ()

@end

@implementation NextViewController


-(id)init{
    self = [super init];
    if(self){
        MyViewController *m=[[MyViewController alloc]init];
        m.delegate = self;
    }
    return self;
}

-(void)loadView{
    [super loadView];

}


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


-(void)groupSelected:(NSString *)grouDetails{
    NSLog(@"groupSelected");
}
@end

感谢您的时间(:

3 个答案:

答案 0 :(得分:1)

我认为您不需要代理来传递数据,您是否尝试传递字符串值'df'?如果是这样,你可以在NextViewController中创建一个公共属性,并在MyViewController中创建NextViewController时为其赋值?

委托是nil,因为它看起来不像你设置的那样,所以在按下按钮逻辑你会做self.delegate = d;,不要在NextViewController的init中分配委托或创建MyViewController,然后检查代表,它不会是零,但我认为在这种情况下你不需要委托模式?

如果您需要我澄清,或者您需要传递其他特别内容,请告诉我。

答案 1 :(得分:1)

试试这个:

-(void)buttnPressed:(id)s{

     NextViewController* d= [self.storyboard instantiateViewControllerWithIdentifier:@"VCidentiferFromStoryBoard"];
    self.delegate = d;
    [self.navigationController pushViewController:d animated:YES];
    if (self.delegate && [self.delegate respondsToSelector:@selector(groupSelected:)]) {
        [self.delegate groupSelected:@"df"];
    }
}

答案 2 :(得分:0)

  1. 修改 MyViewController.m

    buttnPressed
  2. 然后重写-(void)buttnPressed:(id)s { if(!nextViewController) // this way only one time NextVC will be created { nextViewController = [[NextViewController alloc]init]; [self.navigationController pushViewController:nextViewController animated:YES]; self.delegate = nextViewController; } if (self.delegate && [self.delegate respondsToSelector:@selector(groupSelected:)]) { [self.delegate groupSelected:@"df"]; } } 方法,如下所示:

    js-base64-file