見出し画像

【Objective-C】TableViewで押下したセルからポップオーバーを出す実装(UIPopoverPresentationController使用)【Xcode10.1】

こういう人に向けて発信しています。
・UIPopoverPresentationControllerを実装をしたい人
・tableViewでdidSelectedデリゲートメソッドを活用したい人
・Objective-C初心者

使用するクラスについて

・ViewController.h (UIViewController)
・ViewController.m (UIViewController)
・popOverViewController.h (UIViewController)
・popOverViewController.m (UIViewController)


UIPopoverPresentationControllerで表示する、
ViewControllerはUIViewControllerを継承している必要があります。

なので、UITableViewも可能です。

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController

@end

ViewController.m

#import "ViewController.h"
#import "popOverViewController.h"

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,UIPopoverPresentationControllerDelegate>

@end

@implementation ViewController{
    //インスタンス変数の宣言 //これにより、このインスタンスのインスタンスメソッドからアクセスが可能になる。
    //各インスタンスメソッドでアクセスする時は tableViewでアクセス可能。
    UITableView *tableView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    //tableViewの初期化
    //initWithFrame(初期化しつつFrame指定している)
    tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStylePlain];
    
    /*
     tableViewにはUITableViewDelegate,UITableViewDataSource 2つのデリゲートが存在しており、
     「delegateを処理するのはこのインスタンス(self)ですよ」と宣言する必要がある。
     */
    tableView.delegate = self;
    tableView.dataSource = self;

    
    //このインスタンスのViewにtabelViewを描画する。
    [self.view addSubview:tableView];
}

#pragma #UITableView Datasource(実装必須)

//row = 行数を指定するデリゲートメソッド
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //必ずNSInteger型を返してあげている。
    return 30;
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //標準で用意されているTableViewを利用する場合。
    NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    
    cell.textLabel.text = [NSString stringWithFormat:@"このセルは%ld番目のセルになります!", (long)indexPath.row];
    return cell;
}

#pragma #UITableView Delegate(実装必須)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //押下したセルからポップオーバーを出す為にindexPath.row番目のセルを、
    //UItableViewCell型で宣言してセルのインスタンスを取得している。
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
    
    popOverViewController *popOverVC = [[popOverViewController alloc]init];
    //sourceView = ポップオーバーを出すオブジェクトという認識
    [self presentPopOverWithViewController:popOverVC sourceView:selectedCell];
}

#pragma #UIPopoverPresentationControllerDelegate

- (void)presentPopOverWithViewController:(UIViewController *)viewController sourceView:(UIView *)sourceView
{
    viewController.modalPresentationStyle = UIModalPresentationPopover;
    viewController.preferredContentSize = CGSizeMake(400.0, 44.0);
    
    UIPopoverPresentationController *presentationController = viewController.popoverPresentationController;
    presentationController.delegate = self;
    presentationController.permittedArrowDirections = UIPopoverArrowDirectionUp;
    presentationController.sourceView = sourceView;
    presentationController.sourceRect = sourceView.bounds;
    
    //吹き出しの根本が色変わるのでおすすめ。
    presentationController.backgroundColor = [UIColor whiteColor];

    
    [self presentViewController:viewController animated:YES completion:NULL];
}

//iPhoneでの描画に大きく関係するのでしっかり追加しておく
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
    return UIModalPresentationNone;
}

@end

popOverViewController.h

#import <UIKit/UIKit.h>
@interface popOverViewController : UIViewController

@end

popOverViewController.m

#import "popOverViewController.h"

@interface popOverViewController (){
    UIView *secondView;
    UILabel *popOverLabel;

}

@end

@implementation popOverViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initView];
    [self initLabel];

    
    // Do any additional setup after loading the view.
}

-(void)initView{
    secondView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 400.0f, 44.0f)];
    secondView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:secondView];
}

-(void)initLabel{
    popOverLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 0, 400.0f, 44.0f)];
    popOverLabel.text = @"UIPopoverPresentationController!!";
    [secondView addSubview:popOverLabel];
}

この記事が気に入ったらサポートをしてみませんか?