拆分视图弹出代理方法未调用

时间:2012-06-02 20:40:00

标签: objective-c delegates protocols uisplitviewcontroller popover

编辑2:我尝试使用以下代码指向视图控制器:

UIStoryboard * iPadStoryboard = [UIStoryboard storyboardWithName:@“iPadStoryboard”bundle:nil]; GTGiftsIPadViewController * giftsIVC =(GTGiftsIPadViewController *)[iPadStoryboard instantiateViewControllerWithIdentifier:@“giftsTableViewControllerId”]; [giftsIVC setGiftsDelegate:self]; NSLog(@“%@”,giftsIVC); NSLog(@“%@”,[[[[[[[[self]父控件]父视图控制器] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]);

然而,这输出:

2012-06-02 14:28:47.148 Gift Manager[3958:707] <GTGiftsIPadViewController: 0xc6b9980>
2012-06-02 14:28:47.152 Gift Manager[3958:707] <GTGiftsIPadViewController: 0xc6a16d0>

表示giftsIVC未指向正确的视图控制器。它必须指向由[[[[[[[self [父视图]控制器] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]给出的视图控制器。但是,我无法使用此代码,因为它不适用于纵向和横向视图。 这似乎应该是非常直接的事情,但我正在试图解决这个问题!这让我发疯了!

编辑:我发现了问题,这与我如何设置委托有关。这是设置委托的我(糟糕)方式:

[[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0] setGiftsDelegate:self];

基本上[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]只是引用我的表视图控制器。有没有另外一种方法我可以编写这段代码来排除[[[[[[[[self]父控件]父视图控制器] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]部分?

我一直在努力避免创建自己的委托协议,主要是因为我对委托的想法不太满意。无论如何,我昨天开始创建一个,因为我真的需要它,并且它工作得非常好!我有一个拆分视图控制器,当iPad处于横向模式时显示两个控制器(一个表视图和表视图中对象的详细视图)。委托协议的目的是允许表视图在选择表视图中的对象时更新详细视图。这适用于横向模式;但是,在纵向模式下,我只有一个视图控制器和一个按钮来显示一个呈现表视图的弹出窗口(这几乎与iPad上的Notes应用程序完全相同)。

我的问题是,当处于纵向模式并且选择了弹出视图表中的对象时,不会调用didSelectGift方法;但是,在横向模式下它是。请参阅下面的大写评论。

这是我的委托协议代码:

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import "GTAddIPadViewController.h"

@class GTGift, GTGiftCell;

@protocol GTGiftsIPadViewControllerDelegate;


@interface GTGiftsIPadViewController : UITableViewController

@property (nonatomic, assign) id <GTGiftsIPadViewControllerDelegate>giftsDelegate;
@property (nonatomic, strong) IBOutlet UITableView *giftsTable;

@end


@protocol GTGiftsIPadViewControllerDelegate <NSObject>

- (void)didSelectGift:(GTGift *)selectedGift;

@end

在GTGiftsIPadViewController中调用didSelectGift

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    GTGift *gift = [[[GTGiftStore sharedStore] allGifts] objectAtIndex:[indexPath row]];
    [giftsDelegate didSelectGift:gift]; //THIS FUNCTION IS NOT CALLED (TESTED BY PUTTING AN NSLOG INSIDE IT)
    NSLog(@"%@", [gift name]); //THIS OUTPUTS PROPERLY THEREFORE TABLEVIEW:DIDSELECTROWATINDEXPATH: IS CALLED
}

委托在名为GTDetailIPadViewController的视图控制器中设置viewDidLoad方法

didSelectGift方法在​​GTDetailIPadViewController中实现:

- (void)didSelectGift:(GTGift *)selectedGift 
{
    [self setDetailGift:selectedGift];
    [self populateTable];
}

(populateTable是一个使用detailGift的实例变量并使用这些值填充详细信息视图的方法)

我真的无法理解为什么它在分割视图中呈现时表现完美但在弹出视图中显示时不起作用。任何帮助都会非常感激,我希望我的问题清楚了!谢谢!

1 个答案:

答案 0 :(得分:1)

所以,这段代码:

[[[[[[self parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0]

引用你的表视图控制器......这有点疯狂: - )

另外,我不认为代表是去这里的方式..

如果你在XCode中创建了一个标准的主/细节拆分视图项目,那么主控制器(表视图控制器)应该有一个指向DetailViewController的指针(如果我理解正确,那就是你调用委托的部分)你的代码)。

因此,您只需直接指向detailViewController。

,而不是声明任何委托

如果由于某种原因,该指针不存在,您可能想要创建它,并且每当初始化主和细节时,都有这样的:

MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
masterViewController.detailViewController = detailViewController;

(如果您的主人和详细信息没有像这里的代码那样分配,他们仍然应该可以从一个公共场所访问,让我们说应用代表,作为IBOUtlets,你只需要使用第三行代码,确保在主人的标题中有一个属性'detailViewController'

这样,你应该始终从主视图控制器引用detailViewController,这样你就可以从表视图控制器(master)调用它上面的任何方法

[detailViewController didSelectGift:selectedGift];