0

我有一个带有图像视图的视图控制器。

我有一个带有表格视图的弹出框,它锚定到此视图控制器中的条形按钮。

我希望能够通过使用弹出窗口中的表格将图像加载到图像视图中。

弹出框和主视图控制器都有单独的视图控制器类。

我已经从 segue 启动了弹出窗口。

我怎样才能做到这一点?

4

1 回答 1

2

我假设您的 segue 将您从 imageViewController 带到弹出的 tableViewController。

然后您可以将您的 imageViewController 设置为 tableViewController 的委托,以便您可以从 tableViewController 以解耦的方式调用它的方法。

MyTableViewController.h

在您的 tableViewController 头文件中声明一个协议,它将期望它的委托遵循。将其放在您的 @interface 部分上方:

    @protocol MyTableViewControllerDelegate <NSObject>
    - (void) dismissPopoverAndLoadImage:(NSString*)imageName;
    @end

还要声明一个属性来保存对它的委托的引用:

  @property (nonatomic, weak) id <MyTableViewControllerDelegate> delegate;

该协议声明了您的 tableView 期望能够在其委托上调用的方法签名。它允许它发回一些数据,并让自己被解雇。委托(在本例中为您的 imageViewController)必须实现此方法。

MyTableViewController.m

选择表格单元格时,在委托时调用该方法:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
       UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
       NSString* imageName = cell.textLabel.text;
       [self.delegate dismissPopoverAndLoadImage:imageName];
    }

MyImageViewController.h

包括 MyTableViewController.h 并将委托协议添加到@interface.

#include "TableViewController.h

@interface MyImageViewController: UIViewController <MyTableViewControllerDelegate>

声明一个属性来保存对您的 UIPopOverController 的引用,以便您可以向它发送关闭消息:

@property (nonatomic, weak) UIPopoverController* seguePopoverController;

(这些步骤可以移动到您的 .m 文件的类别扩展名以便更好地封装)。

MyImageViewController.m

MyImageViewController您将在的方法中设置委托属性prepareForSegue,该方法在调用 segue 时被调用。您还将在此处设置对 popoverController 的引用。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"popoverTable"]) {
        self.seguePopoverController = [(UIStoryboardPopoverSegue*)segue popoverController];
        [segue.destinationViewController setDelegate:self];
        }
    }
} 

最后,实现 tableViewController 的委托方法:

- (void) dismissPopoverAndLoadImage:(NSString*)imageName
{
    self.imageView.image = [UIImage imageNamed:imageName];
    [self.seguePopoverController dismissPopoverAnimated:YES];
}

更新
除了 popOverController 本身是一个稍微不寻常的实体(没有视图的控制器,直接从 NSObject 继承)这一事实之外,这大部分是标准的委托模式。您可以通过使用一些间接和运行时检查来简化它didSelectRowAtIndexPath

 if ([[self delegate] respondsToSelector:@selector(dismissPopoverAndLoadImage:)])
       [[self delegate] performSelector:@selector(dismissPopoverAndLoadImage:)
                             withObject:imageName];

在这种情况下,您不需要定义协议或协议<adhere>,也不需要#import MyTableViewController. 但是,如果您没有正确实现该方法,编译器不会给您任何帮助。从我之前的错误中可以看出,这可能是不明智的。

于 2013-02-04T01:36:59.723 回答