1

我在从父 SplitViewController 设置的 ViewController 上有一个属性:

财产申报/综合

@interface DownloadRecipesViewController_iPad : DownloadRecipesViewController<PopoverMenuDelegate, RecipeChangeDelegate>{
    id <NSObject, PopoverMenuParentDelegate, RecipeChangeDelegate, RecipeDownloadedDelegate> _selectionDelegate;
}

@property (strong) UIBarButtonItem *btnMenu;
@property (strong) id <NSObject, RecipeChangeDelegate, RecipeDownloadedDelegate> selectionDelegate;

@implementation DownloadRecipesViewController_iPad

@synthesize btnMenu;
@synthesize selectionDelegate = _selectionDelegate;

viewDidLoad我在父 SplitViewVC 的方法中连接了委托:

连接代表

self.downloadVc = [self.storyboard instantiateViewControllerWithIdentifier:@"RecipeDownload"];
[self.downloadVc setSelectionDelegate:self];

Child VC 中的一个按钮调用一个方法来触发一个事件到父 ViewController,但是当这个事件被调用时,委托是 nil 并且事件不会被触发。我绞尽脑汁想方设法找出发生这种情况的原因,但我完全不知所措。

代表在这里为零(解雇代表):

-(IBAction)didTapMenu:(id)sender{
    if([_selectionDelegate respondsToSelector:@selector(shouldToggleMenu)])
        [_selectionDelegate shouldToggleMenu];
}

我也尝试过没有支持属性,但遇到了同样的问题。

4

2 回答 2

0

我最终解决这个问题的方法是:

  1. 创建一个公开方法的新委托:-(void)segueBeginning:(UIStoryboardSegue*)destination
  2. 使用此委托将prepareForSegue 从子UINavigationController 公开给父SplitViewController .3。当在子导航控制器中引发 prepareForSegue 时,在父 ViewController 中连接我的子 VC:

    if([destination.destinationViewController isKindOfClass:[DownloadRecipesViewController_iPad class]] && !self.downloadVc){ // download recipes
        self.downloadVc = destination.destinationViewController;
        self.downloadVc.selectionDelegate = self;
        [self.downloadVc setSnapshotChangeDelegate:self];
        [self.downloadVc.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnAdd, nil]];
    }
    
于 2013-04-13T16:25:34.107 回答
0

关于如何找到这个的建议如下。但首先,为什么不节省一些输入并删除 ivar 并删除 @synthesize ——此时它完全没有必要输入。此外,正如评论所说,代表几乎总是应该被键入为弱。

建议:

1)为selectionDelegate编写一个(临时)设置器,然后设置一个断点,您实际设置值(或之后),以便您可以验证它是否已设置,并且没有其他东西将其归零。

2)在IBAction方法上设置断点,在if语句所在的行,当你点击它时验证对象与你设置委托的那个对象相同,委托值是什么,然后查看respondsTo方法成功(使用单步)。

于 2013-04-13T15:56:40.003 回答