2013-05-13 63 views
3

我想實現JViewEditorPanel,其中CenterViewController滑動並顯示包含TableView的LeftViewControler。一旦用戶在TableView中選擇了一行,我希望CenterView通過向後滑動恢復其位置,並且還有一個方法(在CenterViewController中)通過LEftViewController中的參數調用以更新CenterView。有人可以幫助我嗎?ViewController與JASidePanels之間發送數據

謝謝。

+0

Jasidepanel是一個很好的控件,但還有其他控件更容易爲您實現。嘗試在我的答案中的一個,它不會讓你感到困惑。 – 2013-05-13 23:36:02

回答

4

有兩個部分解決問題的方法:

  1. 第一表示中心面板時用戶選擇一行:

[self.viewController showCenterPanelAnimated:YES]; //此方法添加到您的tableView行

  1. 傳遞消息回中央面板與新的指令,這可以通過創建委託或通知來完成。保持它的簡單,我將使用通知:在你的左側面板類

// Add to your tableView row method 
    NSNotification *msg = [NSNotification notificationWithName:@"leftPanelMsg" object:@"Hello"]; 
    [[NSNotificationCenter defaultCenter] postNotification:msg]; 
在中央面板類

: 添加觀察員在viewDidLoad中和另一種方法時傳回消息:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // method listen to meesssage with specfic name and calls selector when it get hit 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(msgResponder:) name:@"leftPanelMsg" object:nil]; 
    } 

-(void)msgResponder:(NSNotification *)notification { 
    NSLog(@"name:%@ object:%@", notification.name, notification.object); 
} 
+0

非常感謝。絕對是最簡單的方法。非常感激。 – pbeaumier 2013-05-16 20:15:59

+0

工作正常,但爲什麼它被稱爲兩次? NSLog打印兩次 – CGR 2016-12-02 18:12:51

+0

@CGR我從來沒有在iOS 7-9上嘗試過這個問題。我只能假設代碼庫中存在一個錯誤 – 2016-12-03 14:00:52

0

你看到JASidePanels這些方法

// toggle them opened/closed 
- (void)toggleLeftPanel:(id)sender; 
- (void)toggleRightPanel:(id)sender; 

JASidePanels是一個很好的實現,可以設置左,中,右視圖控制器。因此,讓我們說你有一個UITableViewController作爲左VC,並根據行選擇加載中心VC。你應該在左邊的VC中有#import「UIViewController + JASidePanel.h」。

​​
+0

toggleLeftPanel隱藏表格,它使得視圖平滑,但是如表格隱藏,通知能夠在屏幕上閃爍。但是當您滑動中央面板時,桌子已經在那裏,那麼爲什麼它隱藏了桌子。 – 2013-08-21 13:38:08

+0

它不一定隱藏表格視圖,它隱藏在JASidePanel初始化中設置的leftPanelController。視圖控制器已經坐在那裏,中央面板剛剛離開原來的合作伙伴。 – satheeshwaran 2013-08-21 13:50:46

2

如果你想使用委託,那麼你必須添加一個協議到LeftViewController.h文件,例如

@protocol LeftViewControllerDelegate <NSObject> 

-(void)useThisValue:(NSString *)value; 

@end 

@interface LeftViewController : UITableViewController 

@property (weak, nonatomic) id <LeftViewControllerDelegate> delegate; 

@end 

在你的tableView:didSelectRowAtIndexPath方法:方法,可以再加入

[self.delegate useThisValue:menu[indexPath.row]]; 

你CenterViewController將成爲LeftViewController的代表,所以在你的CenterViewController.h文件,導入LeftViewController.h和加:

@interface CenterViewController : UIViewController <LeftViewControllerDelegate> 

- (void)useThisValue:(NSString *)value; 

在你的CenterViewController.m文件中,導入AppDelegate.h和你的RootViewController.h文件。在其viewDidLoad方法,你必須讓你的JASidePanelController子類(RootViewController的)和leftViewController的當前實例的引用:

RootViewController *rootViewController = (RootViewController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController]; 

LeftViewController *leftViewController = (LeftViewController *)rootViewController.leftPanel; 

然後進行CenterViewController的LeftViewController的代表:

leftViewController.delegate = self; 

[super viewDidLoad]; 

實現自己的喜好委託方法,例如:

- (void) useThisValue:(NSString *)value 
{ 
    self.label.text = value; 
} 

我不得不承認,在這裏感謝凱文·麥克尼什以指出如何正確獲取RootViewController和LeftViewController的實例,以便讓委託模式與JASidePanels一起工作。

+0

謝謝!我想知道是否可以包含「UIViewController + JASidePanel.h」,並使用它來代替查找根控制器和左側面板?我正在嘗試它,並且左側面板保持爲零。 – SunnyD 2014-03-20 04:58:48