【发布时间】:2014-03-02 13:27:50
【问题描述】:
我正在构建一个调用不同子视图并将它们放在主视图控制器中的应用程序 (http://imgur.com/p6l9Oac)
当用户点击屏幕底部的一个按钮(我们称之为滑动菜单!)它后面的视图将消失并出现新的视图。
其中一个子视图是 Settings ,它有一些开关来启用/禁用某些按钮。
在 SettingsViewController 中。 我已经制定了协议:
@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 来确保我正确调用了这些功能。
在 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 根本没有被调用,任何人都可以帮助我吗?
谢谢
更新:因为我有超过 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];
但是这个方法没有分配委托
【问题讨论】:
-
switchAction真的被调用了吗?将NSLog放在顶部或在其中的断点处,以查看它是否真的被调用。我看到它是IBAction。您很可能忘记在界面生成器中关联操作。 -
是的 switchAction 正在被调用,因为我可以在控制台中看到“视图已隐藏”和“视图已显示”
-
在
switchAction中设置断点并确保委托不为零。我怀疑它要么没有正确设置,要么在它应该被释放之前被释放。 -
是的,_delegate 是一个空指针,我该如何解决?
-
检查设置代表的
viewDidLoad方法。那时settingsViewController和slidingMainMenuViewController为零吗?如果是,您需要在设置它们的委托之前实例化它们,否则您实际上并没有在那里做任何事情。
标签: ios objective-c methods delegates