Tuesday, December 3, 2013

JASidePanelで左メニューが表示される際のデリゲートを作成する

左のメニューが表示されるさいに、その中のtableviewを更新したいなーと思っていたので、ごちゃごちゃやってたら出来ました。
参考にしたのは以下の二つのリンク
逆引きObjective-C for iPhoneアプリ - デリゲートを自作クラスに実装する
[iOS] Protocol – Delegateパターン | Objective-C イベント伝達 その1 « きんくまデザイン

以下、その手順です。

1. delegateプロパティをJASidePanelController.hに追加する

以下のコードをJASidePanelController.hに加えます。

@property (nonatomic, assign) id delegate;

2. プロトコルをJASidePanelController.hファイルの中で定義します

プロトコルをJASidePanelController.hファイルの中にこう定義します。
(プロトコルがなんなのかは現段階で理解できていないが、気にしない♪)

// ここまで省略

@protocol JASidePanelControlDelegate; // ここを追加しました

typedef enum _JASidePanelStyle {
    JASidePanelSingleActive = 0,
    JASidePanelMultipleActive
} JASidePanelStyle;

typedef enum _JASidePanelState {
    JASidePanelCenterVisible = 1,
    JASidePanelLeftVisible,
    JASidePanelRightVisible
} JASidePanelState;

@interface JASidePanelController : UIViewController

#pragma mark - Usage
/*
ここからずっと下まで省略
*/

// Containers for the panels.
@property (nonatomic, strong, readonly) UIView *leftPanelContainer;
@property (nonatomic, strong, readonly) UIView *rightPanelContainer;
@property (nonatomic, strong, readonly) UIView *centerPanelContainer;

@property (nonatomic, assign) id delegate; // これを追加しました

@end


/************ ここから下のコードも追加しました ************/
@protocol JASidePanelControlDelegate 

@optional
- (void) JASidePanelControl:(JASidePanelController *)controller leftMenuVisible:(UIViewController *)viewController;

@end

3. 左メニューが表示されるところでデリゲートを呼び出す。

僕はここにこう書きました。

- (void)toggleLeftPanel:(__unused id)sender {
    NSLog(@"%@", _visiblePanel);
    
    if (self.state == JASidePanelLeftVisible) {
        [self _showCenterPanel:YES bounce:NO];
    } else if (self.state == JASidePanelCenterVisible) {
        [self.delegate JASidePanelControl:self leftMenuVisible:_leftPanel]; // ここを追加
        [self _showLeftPanel:YES bounce:NO];
    }
}

4. 最後にJASidePanelControllerのサブクラスでデリゲートを設定しデリゲートメソッドを埋める

// ~省略~
- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.
    
    self.delegate = self;
}

// ~省略~
- (void) JASidePanelControl:(JASidePanelController *)controller leftMenuVisible:(UIViewController *)viewController {
    leftMenuViewController *leftMenu = (leftMenuViewController *)viewController;
    [leftMenu.table reloadData];
}

多分、これでこれから表示されるViewControllerのメソッドを実行できるはず。

それよりも、はてなブログってすごいな。
あっちにコードがものすごくきれいに表示される。これからあそこをメインにしようっと。

でけたーーー!!驚きです。

No comments:

Post a Comment