我有一个带有图像视图的视图控制器。
我有一个带有表格视图的弹出框,它锚定到此视图控制器中的条形按钮。
我希望能够通过使用弹出窗口中的表格将图像加载到图像视图中。
弹出框和主视图控制器都有单独的视图控制器类。
我已经从 segue 启动了弹出窗口。
我怎样才能做到这一点?
我有一个带有图像视图的视图控制器。
我有一个带有表格视图的弹出框,它锚定到此视图控制器中的条形按钮。
我希望能够通过使用弹出窗口中的表格将图像加载到图像视图中。
弹出框和主视图控制器都有单独的视图控制器类。
我已经从 segue 启动了弹出窗口。
我怎样才能做到这一点?
我假设您的 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
. 但是,如果您没有正确实现该方法,编译器不会给您任何帮助。从我之前的错误中可以看出,这可能是不明智的。