从弹出窗口中的表加载图像视图中的图像

时间:2013-02-03 17:26:47

标签: cocoa-touch

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

我有一个带有表格视图的弹出框,它固定在这个视图控制器的一个条形按钮上。

我希望能够使用popover中的表格将图像加载到图像视图中。

popover和主视图控制器都有单独的视图控制器类。

我已经从segue推出了popover。

我该怎么做?

1 个答案:

答案 0 :(得分: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的引用,以便您可以向它发送一个dismiss消息:

@property (nonatomic, weak) UIPopoverController* seguePopoverController;

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

MyImageViewController.m

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

prepareForSegue

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

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

更新
除了popOverController本身是一个稍微不同寻常的实体(没有视图的控制器,直接从NSObject继承)这一事实,其中大部分是标准委托模式。您可以通过在- (void) dismissPopoverAndLoadImage:(NSString*)imageName { self.imageView.image = [UIImage imageNamed:imageName]; [self.seguePopoverController dismissPopoverAnimated:YES]; }

中使用一些间接和运行时检查来进行一些简化
didSelectRowAtIndexPath

在这种情况下,您无需为其定义协议或 if ([[self delegate] respondsToSelector:@selector(dismissPopoverAndLoadImage:)]) [[self delegate] performSelector:@selector(dismissPopoverAndLoadImage:) withObject:imageName]; ,也不需要<adhere>。但是,如果您没有正确实现该方法,编译器将不会给您任何帮助。从我之前的错误中可以看出,这可能是不明智的。