1

编辑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 的实例变量并使用这些值填充详细视图的方法)

我真的不明白为什么当表格显示在拆分视图中时它可以正常工作,但当它显示在弹出视图中时它不起作用。任何帮助将不胜感激,我希望我已经把我的问题说清楚了!谢谢!

4

1 回答 1

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];
于 2012-06-03T07:37:12.730 回答