【问题标题】:Delegate Method not being called by the parent view?父视图没有调用委托方法?
【发布时间】: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 方法。那时settingsViewControllerslidingMainMenuViewController 为零吗?如果是,您需要在设置它们的委托之前实例化它们,否则您实际上并没有在那里做任何事情。

标签: ios objective-c methods delegates


【解决方案1】:

如果 settingsViewController 是一个 IBOutlet,您必须将 IBOutlet 添加到它的声明中并使用情节提要或 xib 连接它。

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

但如果它不是一个 Outlet,你必须在设置它的委托之前分配它。

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

您还应该验证您的 - (IBAction)switchAction:(id)sender IBAction 在情节提要或 xib 中正确连接。

【讨论】:

  • 验证您的- (IBAction)switchAction:(id)sender IBAction 在情节提要或xib中正确连接
  • 你在哪里分配初始化你的对象?你可以在你的问题中添加这部分代码吗?
  • 你能在你的问题中添加你分配你的 settingsViewController 的代码吗?这会对我们有所帮助。
  • 我更新了问题,我认为我在调用该函数以查看 viewController 时做错了。
【解决方案2】:

当您初始化 SettingsViewController 时,请确保您使用情节提要方法而不是 [[SettingsViewController alloc] init]


首先在您的故事板视图中直接设置Storyboard ID

然后用这个settingsViewController:

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

MainStoryboard_iPhone 替换为您的故事板名称。

希望有帮助!

【讨论】:

  • 我正在使用它,我可以调用视图,但问题在于正确分配代理,谢谢您的回答!
  • @user3277090 您能否在将代理设置为viewDidLoad 之前检查self.settingsViewController 的值并将其写在这里?
  • _settingsViewController SettingsHubViewController * 0x9ab5180 0x09ab5180 UIViewController UIViewController _enableCountdown UISwitch * 0x9ab5a30 0x09ab5a30 _delegate id 0x0 0x00000000 _mainView UIView * 0x9ab7720 0x09ab7720
  • 如果在self.settingsViewController.delegate = self; 之后插入NSLog(@"%@", self.settingsViewController.delegate) 会说明什么?
【解决方案3】:

// 如果你正在使用视图控制器
SettingsHubViewController *settingVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"yourStoryBoardIdentifier"];

settingVC.delegate = self;

// 如果你使用 XIB 加载 NIB,然后设置 settingVC.delegate = self;

它对我有用(我创建了 OverLay 视图并加载到主类中)

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2020-11-14
    • 2020-11-28
    • 2017-05-04
    • 2012-11-10
    相关资源
    最近更新 更多