0

画像ビューを含むビューコントローラーがあります。

このView Controllerのバーボタンに固定されているテーブルビューを含むポップオーバーがあります。

ポップオーバーのテーブルを使用して、画像を画像ビューにロードできるようにしたいと考えています。

ポップオーバーとメイン ビュー コントローラーの両方に、個別のビュー コントローラー クラスがあります。

セグエからポップオーバーを起動しました。

これどうやってするの?

4

1 に答える 1

2

セグエが 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。ただし、メソッドを正しく実装しないと、コンパイラは何の助けにもなりません。私の以前の間違いからわかるように、これはおそらく賢明ではありません。

于 2013-02-04T01:36:59.723 に答える