Много-к-одному общение UIViewController.Навигационный контроллер Push View.Делегат или NSNotificationCenter или метод класса? - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть UIViewController «NavigationViewController», который добавляется как подпредставление моего «FirstViewController», занимающего весь экран (то есть аналогично контроллеру Flipboard Navigation в приложении iPad). Многие виды добавляются и удаляются в зависимости от выбора пользователя. Я хочу быть в состоянии выдвинуть контроллер представления в «FirstViewController» navigationController из «множества представлений», которые добавлены. В этом случае «FeaturedViewController» является одним из тех многочисленных представлений, которые можно выбрать. Он наследует ContentViewController, где определен протокол делегата.

TL; DR Я хочу получить доступ к навигационному контроллеру в первом представлении, чтобы выдвинуть представление из добавленного подпредставления «FeaturedViewController».

Вот визуальное представление: enter image description here

Вот мой код от:

Вот моя текущая попытка, которая не работает. Обратите внимание, я взял некоторый код, относящийся к «контроллеру навигации»

/* First View Controller */

#import <UIKit/UIKit.h>
#import "ContentViewController.h"

@interface ViewController : UIViewController <BaseViewDelegate, ContentViewDelegate>
{
    IBOutlet UINavigationController *navigationController;
    ContentViewController *contentView;
}

@property (strong, nonatomic) IBOutlet UINavigationController *navigationController;
@property (strong, nonatomic) ContentViewController *contentView;

---------------------------------------------------------

#import "ViewController.h"
#import "NavigatorViewController.h"
#import "BinViewController.h"

@implementation ViewController
@synthesize navigationController, contentView;

static NSArray *viewArray = nil;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.navigationController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view addSubview:navigationController.view];

    // Navigation View is used to navigate throughout the entire application
    NavigatorViewController *navController = [[NavigatorViewController alloc] init];

    contentView = [[ContentViewController alloc] init];

    contentView.delegate = self;

    // Add the views to the array (using ARC)
    viewArray = [NSArray arrayWithObjects:navController, contentView, nil];

}

-(void)displayNavigator
{
    // Get the right view controller    
    UIViewController *viewController = [viewArray objectAtIndex:0];
    // Add the subview to the view
    [self.view addSubview:viewController.view];
}

-(void)pushViewController:(UIViewController *)viewController 
{    
    NSLog(@"First View Push View Controller called");

    [self.navigationController pushViewController:viewController animated:YES];
}
@end

/* Content View Controller */

@class ContentViewController;
@protocol ContentViewDelegate <NSObject>
-(void)pushViewController:(UIViewController *)viewController;
@end

@interface ContentViewController : UIViewController 
{
    __weak id <ContentViewDelegate> delegate;    
}

@property (weak) __weak id <ContentViewDelegate> delegate;

- (void)pushView:(UIViewController *)viewController;

@end

---------------------------------------------------------

#import "ContentViewController.h"
#import "BinViewController.h"

@implementation ContentViewController

@synthesize delegate;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];    
}

- (void)pushView:(UIViewController *)viewController
{        

    NSLOG(@"Push View from ContentViewController");
    if ([delegate respondsToSelector:@selector(pushViewController)])
      [delegate pushViewController];

}

@end

/* View that is added to the navigator view (it inherits ContentViewController where the delegate protocol is defined)*/
#import <UIKit/UIKit.h>
#import "ContentViewController.h"

@interface FeaturedViewController : ContentViewController <CustomPagingDelegate>

@end

---------------------------------------------------------

#import "FeaturedViewController.h"
#import "BinViewController.h"

@implementation FeaturedViewController

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void) touchUpInsideItemAtIndex:(NSUInteger)itemIndex 
{
   //  [[[[[self view] superview] superview] superview] removeFromSuperview];
    NSLOG(@"Touch up inside from featured view");

    BinViewController *binViewController = [[BinViewController alloc] init];

    [self pushView:binViewController];    
}

@end

1 Ответ

0 голосов
/ 23 декабря 2011

Много в один или один ко многим звучит как самый простой способ - использовать NSNotificationCenter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...