未调用拆分视图弹出框委托方法

Posted

技术标签:

【中文标题】未调用拆分视图弹出框委托方法【英文标题】:Split View Popover Delegate Method Not Called 【发布时间】:2012-06-02 20:40:00 【问题描述】:

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

UIStoryboard *iPadStoryboard = [UIStoryboard storyboardWithName:@"iPadStoryboard" bundle: nil]; GTGiftsIPadViewController *giftsIVC = (GTGiftsIPadViewController *)[iPadStoryboard instantiateViewControllerWithIdentifier: @"giftsTableViewControllerId"]; [giftsIVC setGiftsDelegate:self]; NSLog(@"%@", 礼物IVC); NSLog(@"%@", [[[[[[self parentViewController] parentViewController] 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] 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 parentViewController] parentViewController] childViewControllers] objectAtIndex:0] childViewControllers] objectAtIndex:0] 部分?

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

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

这是我的委托协议代码:

#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

didSelectGift 在 GTGiftsIPadViewController 中被调用

- (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】:

所以,这段代码:

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

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

另外,我不认为委托是去这里的方式..

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

因此,您无需声明任何委托,而是直接指向该 detailViewController。

如果由于某种原因,该指针不存在,您会想要创建它,并且每当初始化 master 和 detail 时,都有如下内容:

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

(如果你的 master 和 detail 没有像这里那样在代码中分配,它们应该仍然可以从一个公共位置访问,比如说应用程序委托,作为 IBOUtlets,然后你只需使用第三行代码,在制作之后确保你的主人的标题中有一个属性'detailViewController')

这样,您应该始终从主视图控制器引用 detailViewController,因此您可以从表视图控制器(主)调用任何方法

[detailViewController didSelectGift:selectedGift];

【讨论】:

哇哦!这是一个更好的方法!我也觉得这很疯狂,哈哈,但我一辈子都想不通它是什么!非常感谢,非常感谢

以上是关于未调用拆分视图弹出框委托方法的主要内容,如果未能解决你的问题,请参考以下文章

在拆分视图中更改主视图不会更新纵向弹出框

UIPopoverController 委托委托方法未被调用

关闭拆分视图弹出框控制器

从弹出框控制器调用模态视图的方法

向弹出框的 uibarbuttonitem 添加自定义视图

弹出框未附加到锚点