【问题标题】:Many-to-one UIViewController communication. Navigation Controller Push View. Delegate or NSNotificationCenter or Class Method?多对一 UIViewController 通信。导航控制器推送视图。委托或 NSNotificationCenter 或类方法?
【发布时间】:2011-12-22 23:57:18
【问题描述】:

我有一个 UIViewController “NavigationViewController”,它被添加为占据整个屏幕的“FirstViewController”的子视图(即类似于 iPad 应用程序中的 Flipboard Navigation 控制器)。根据用户所做的选择添加和删除许多视图。我希望能够从添加的“许多视图”中将视图控制器推送到“FirstViewController”navigationController。在这种情况下,“FeaturedViewController”是可以选择的众多视图之一。它继承了定义委托协议的 ContentViewController。

TL;DR 我想在第一个视图中访问导航控制器,以从添加的子视图“FeaturedViewController”推送视图。

这是一个视觉表示:

这是我的代码:

这是我目前不起作用的尝试。请注意,我取出了一些与“导航控制器”相关的代码

/* 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

【问题讨论】:

    标签: iphone objective-c ios ipad delegates


    【解决方案1】:

    多对一或一对多听起来最简单的方法是使用 NSNotificationCenter。

    【讨论】:

    • 谢谢。用 NSNotificationCenter 搞定了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2013-06-04
    • 1970-01-01
    • 2014-01-11
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多