Domanda

I have subclassed a view that I am using as header view it has some buttons delegate inside it and it works perfect .

However I am presenting a modalViewController above my viewController . (in my modalViewController I have implemented the same header , and it does get the delegates from the header) but this view it self has to delegate to the previous viewController if the back button of the header is pressed.

I have made the same functions but my viewController never gets it's delegate... :( I am quite new to Obj-C and I don't know maybe I am doing something illegal here.

here is the code of modalViewController trying to delegate to the previous viewController

#pragma mark - header delegate
- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
    if(header == logo)
    {
        NSLog(@"gotBackButtonDelegate");
        //delete the items array
        //_itemSourceArray = nil;
        [delegate allEventsDrillPage:self backbuttonPressed:sender];
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

This delegate does triggers from the header view.

however in my previous viewController:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender //doesn't work :(
{
    NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//    [self dismissViewControllerAnimated:YES completion:nil];
    _drillPage = nil;
}

never get called

I calling the modalViewController like this:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [_allEventsTableView deselectRowAtIndexPath:indexPath animated:YES];
     [self->_allEventsTableView setNeedsDisplay];
     [self->_allEventsTableView reloadData];
     _drillPage = [[allEventsDrillPage alloc]initWithDictionary:((NSDictionary*)    [_tableDataSource objectAtIndex:indexPath.row])];
     _drillPage.delegate = self;
     [self presentViewController:_drillPage animated:YES completion:nil];
}

in its .h file I did

@interface allEvents : UIViewController <headerDelegate , UITableViewDataSource , UITableViewDelegate ,allEventsDrillPageDelegate>

I don't get what am I missing here :-/ can some1 take a look please ? if needed more info I will added just ask for it.

EDIT:

protocol of delegate inside the modalViewController

@class allEventsDrillPage;
@protocol allEventsDrillPageDelegate   //define delegate protocol
    - (void)allEventsDrillPage:(allEventsDrillPage*)allEventsDrillPage backbuttonPressed:(UIButton*)sender;
@end
@interface allEventsDrillPage : UIViewController
{    
   id<allEventsDrillPageDelegate> __weak delegate;
   ....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; //define 
È stato utile?

Soluzione 2

nmh's answer is correct. I wrote up an answer earlier but his came in faster, so I thought I would take out the other parts and just add the explanations here.

You have this:

@interface allEventsDrillPage : UIViewController
{    
   id<allEventsDrillPageDelegate> __weak delegate;
   ....
}
@property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate;

With this id<allEventsDrillPageDelegate> __weak delegate; you declare an ivar.

With this @property (weak, nonatomic) id <allEventsDrillPageDelegate> delegate; you are declaring a property.

Since Xcode 4.4 you get auto-synthesization. And so this line:

_drillPage.delegate = self;

You are setting the one via the property.

And not this:

id<allEventsDrillPageDelegate> __weak delegate;

So what you have here:

[delegate allEventsDrillPage:self backbuttonPressed:sender];

You are using the ivar above, not the one via the property. And delegate is thus nil.

And so, if you try to send a message to the delegate using nmh's solution or:

[self.delegate allEventsDrillPage:self backbuttonPressed:sender];

It should work as expected.

Addendum to dismissing modal view controller:

Instead of dismissing it from the current view controller, dismiss it from the one who presented it, so:

- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
    if(header == logo)
    {
        NSLog(@"gotBackButtonDelegate");
        [_delegate allEventsDrillPage:self backbuttonPressed:sender]; 
        //or self.delegate
    }
}

And in:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender
{
    NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    [self dismissViewControllerAnimated:YES completion:nil];
    _drillPage = nil;
}

Or even better:

- (void)allEventsDrillPage:(allEventsDrillPage *)allEventsDrillPage backbuttonPressed:(UIButton *)sender 
{
     NSLog(@"got back delegate!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     [self dismissViewControllerAnimated:YES completion:^{
         _drillPage = nil;
     }];
}

Hope this helps.

Altri suggerimenti

Let's try:

- (void)header:(header *)header backbuttonPressed:(UIButton *)sender
{
    if(header == logo)
    {
        NSLog(@"gotBackButtonDelegate");
        // delete the items array
        //_itemSourceArray = nil;

        // my comment: you should replace "delegate" to "_delegate" 
        // and it works.  I tested. It's OK. Wow.

        [_delegate allEventsDrillPage:self backbuttonPressed:sender];
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top