编辑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 方法;但是,在横向模式下是这样。请参阅下面的大写评论。
这是我的委托协议代码:
#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 的实例变量并使用这些值填充详细视图的方法)
我真的不明白为什么当表格显示在拆分视图中时它可以正常工作,但当它显示在弹出视图中时它不起作用。任何帮助将不胜感激,我希望我已经把我的问题说清楚了!谢谢!