2014-02-05 4 views
0

Im строит приложение, которое вызывает различные подвидов и заложить их на в главном контроллере представления (http://imgur.com/p6l9Oac)Метод делегата не вызывается родительским представлением?

когда-либо пользователь нажимает на кнопку в нижней части экрана (назовет его раздвижным меню!) Вид за ней исчезнут, и появится новая.

Одним из подзонов является «Настройки», в котором у него есть некоторые переключатели для включения/выключения некоторых кнопок.

в НастройщикеПросмотр. Ive установить протокол:

@protocol SettingsViewControllerDelegate <NSObject> 
@required 
-(void)hideCountdownView; 
-(void)showCountdownView; 
@end 

и интерфейс содержит:

@interface SettingsHubViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UISwitch *enableCountdown; 
@property (nonatomic, assign) id <SettingsViewControllerDelegate> delegate; 
@property (weak, nonatomic) IBOutlet UIView *mainView; 
@end 

и в осуществлении:

- (IBAction)switchAction:(id)sender { 
    if (!self.enableCountdown.on) { 
     NSLog(@"The view is Hidden"); 
     [_delegate hideCountdownView]; 
    } else if (self.enableCountdown.on) { 
     NSLog(@"The view is Shown"); 
     [_delegate showCountdownView]; 
    } 
} 

Вы можете увидеть, я использовал _delegate использовать шоу и скрыть функции , Я использовал NSLog, чтобы убедиться, что Im вызывает функции правильно.

в MainViewController

#import "SettingsHubViewController.h" 
@interface MainViewController() <SettingsViewControllerDelegate> 

@property (nonatomic, strong) SettingsHubViewController * settingsViewController; 

и реализации

@implementation MainViewController

-(void)showCountdownView { 
    self.slidingMainMenuViewController.countdownView.hidden = NO; 
    NSLog(@"Showing Countdown"); 
} 

-(void)hideCountdownView { 
    self.slidingMainMenuViewController.countdownView.hidden = YES; 
     NSLog(@"Hiding Countdown"); 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    self.settingsViewController.delegate = self; 
    self.slidingMainMenuViewController.delegate = self; 
} 

проблема заключается в том, что NSLogs выше не вызывается вообще, может ли один помочь мне ?

Благодаря

UPDATE: Поскольку у меня есть более 20 различных мнений, что должно быть названо, я создал этот метод

- (UIView *) getPresentedMenu:(NSString *) menuIdentifer withMenuTag:(int) menuTag withAViewController:(UIViewController*) menuViewController andMenuDelegate:(id) menuDelegate { 
    menuViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:Nil] instantiateViewControllerWithIdentifier:menuIdentifer]; 
    menuViewController.view.tag = menuTag; 
    if (self.viewBeingCalledBySwipe == NO) { 
     menuViewController.view.frame = CGRectMake(0, menuViewController.view.frame.size.height, menuViewController.view.frame.size.width, menuViewController.view.frame.size.height); 
    } else if (self.isItRightSwipe == YES) { 
     menuViewController.view.frame = CGRectMake(-menuViewController.view.frame.size.width, 0, menuViewController.view.frame.size.width, menuViewController.view.frame.size.height); 
    } else if (self.isItRightSwipe == NO) { 
     menuViewController.view.frame = CGRectMake(menuViewController.view.frame.size.width, 0, menuViewController.view.frame.size.width, menuViewController.view.frame.size.height); 
    } 

    [self.view addSubview:menuViewController.view]; 
    [self addChildViewController:menuViewController]; 
    [menuViewController didMoveToParentViewController:self]; 

    UIView *view = menuViewController.view; 
    return view; 
} 

Так что, когда когда-либо я нужен определенный контроллер представления, я просто называю это функция

self.childView = [self getPresentedMenu:@"Settings" withMenuTag:SETTINGS_TAG withAViewController:self.settingsViewController andMenuDelegate:self.settingsViewController.delegate]; 

, но этот метод не назначая делегат

+0

является 'switchAction', фактически получившим вызов? Поместите «NSLog» наверху или точку останова внутри него, чтобы увидеть, действительно ли он вызван. Я вижу, что это «IBAction». Вы, скорее всего, забыли подключить действие в построителе интерфейса. – Dima

+0

Да switchAction вызывается, потому что я вижу «Контекст скрыт» и «Вид показан» на консоли – user3277090

+0

Установите точку останова в 'switchAction' и убедитесь, что делегат не равен нулю. Я подозреваю, что он либо не установлен должным образом, либо освобождается до того, как он будет. – Dima

ответ

0

Если settingsViewController является IBOutlet, вы должны добавить IBOutlet в его объявление и подключить его с помощью раскадровки или xib.

@property (nonatomic, strong) IBOutlet SettingsHubViewController * settingsViewController; 

Но если это не выход, вы должны выделить его перед тем, как установить его делегат.

self.settingsViewController = [[SettingsHubViewController alloc] init]; 
self.settingsViewController.delegate = self; 

Вы также должны убедиться, что ваш - (IBAction)switchAction:(id)sender IBAction правильно подключен в раскадровке или XIb.

+0

Я использовал alloc и init, и он не работал :( – user3277090

+0

Убедитесь, что ваш '- (IBAction) switchAction: (id) отправитель' IBAction правильно подключен в раскадровке или xib – bsarr007

+0

Где вы можете выделить init свой объект? Вы можете добавить эту часть кода в свой вопрос? – bsarr007

0

Когда вы инициализируете свой SettingsViewController, убедитесь, что вы делаете это с использованием метода раскадровки, а не [[SettingsViewController alloc] init].


Сначала установите Storyboard ID непосредственно на ваш взгляд раскадровки:

enter image description here

Затем используйте это settingsViewController:

self.settingsViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:NULL] instantiateViewControllerWithIdentifier:@"SettingsViewController"]; 

Заменить MainStoryboard_iPhone с раскадровки именем.

Надеюсь, что это поможет!

+0

Я использую это, я могу вызвать представление, но проблема в правильном назначении делегата, спасибо для вашего ответа! – user3277090

+0

@ user3277090 Не могли бы вы проверить значение 'self.settingsViewController' до установив делегата в свой 'viewDidLoad' и напишите его здесь, пожалуйста? – jbouaziz

+0

_settingsViewController \t SettingsHubViewController * \t 0x9ab5180 \t 0x09ab5180 UIViewController \t UIViewController \t \t _enableCountdown \t UISwitch * \t 0x9ab5a30 \t 0x09ab5a30 _delegate \t ID \t 0x0 \t 0x00000000 _mainView \t UIView * \t 0x9ab7720 \t 0x09ab7720 – user3277090

Смежные вопросы