画像ビューを含むビューコントローラーがあります。
このView Controllerのバーボタンに固定されているテーブルビューを含むポップオーバーがあります。
ポップオーバーのテーブルを使用して、画像を画像ビューにロードできるようにしたいと考えています。
ポップオーバーとメイン ビュー コントローラーの両方に、個別のビュー コントローラー クラスがあります。
セグエからポップオーバーを起動しました。
これどうやってするの?
画像ビューを含むビューコントローラーがあります。
このView Controllerのバーボタンに固定されているテーブルビューを含むポップオーバーがあります。
ポップオーバーのテーブルを使用して、画像を画像ビューにロードできるようにしたいと考えています。
ポップオーバーとメイン ビュー コントローラーの両方に、個別のビュー コントローラー クラスがあります。
セグエからポップオーバーを起動しました。
これどうやってするの?
セグエが 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 をインクルードし、delegate プロトコルを に追加します@interface
。
#include "TableViewController.h
@interface MyImageViewController: UIViewController <MyTableViewControllerDelegate>
UIPopOverController への参照を保持するプロパティを宣言して、却下メッセージを送信できるようにします。
@property (nonatomic, weak) UIPopoverController* seguePopoverController;
(これらの手順は、より適切にカプセル化するために、.m ファイルのカテゴリ拡張子に移動できます)。
MyImageViewController.m
MyImageViewController
のメソッドでデリゲート プロパティを設定しますprepareForSegue
。これは、セグエが呼び出されたときに呼び出されます。また、ここで 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
。ただし、メソッドを正しく実装しないと、コンパイラは何の助けにもなりません。私の以前の間違いからわかるように、これはおそらく賢明ではありません。