2015-04-01 44 views
0

在我的iOS应用程序中,我有一个带有三个按钮的主视图控制器,其工作方式类似于选项卡栏:当我单击其中一个按钮时,会调用一个新的视图控制器。 我试图通过容器视图容器实现这一点,所以我试着按照这个指南(http://www.thinkandbuild.it/working-with-custom-container-view-controllers/)调用主控制器的viewDidLoad中的presentDetailController方法。无法显示子视图(iOS视图容器)

其实,没有观点显示:有人可以帮我搞清楚为什么?谢谢。

ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UIButton *btnOne; 
@property (weak, nonatomic) IBOutlet UIButton *btnTwo; 
@property (weak, nonatomic) IBOutlet UIButton *btnThree; 
@property (weak, nonatomic) IBOutlet UIView *detailView; 

- (IBAction)click:(id)sender; 

@end 

ViewController.m

#import "ViewController.h" 
#import "FirstViewController.h" 

@interface ViewController() 
@property UIViewController *currentDetailViewController; 
@end 

@implementation ViewController 
@synthesize btnOne, btnTwo, btnThree; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
FirstViewController *fvc = [[FirstViewController alloc]initWithString:@"I'm the first Controller!"]; 

    [self presentDetailController:fvc]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)click:(id)sender 
{ 
    // button selection stuff 

    [self addDetailController:sender]; 
} 

- (void)presentDetailController:(UIViewController*)detailVC{ 

    //0. Remove the current Detail View Controller showed 
    if(self.currentDetailViewController){ 
     [self removeCurrentDetailViewController]; 
    } 

    //1. Add the detail controller as child of the container 
    [self addChildViewController:detailVC]; 

    //2. Define the detail controller's view size 
    detailVC.view.frame = [self frameForDetailController]; 

    //3. Add the Detail controller's view to the Container's detail view and save a reference to the detail View Controller 
    [self.detailView addSubview:detailVC.view]; 
    self.currentDetailViewController = detailVC; 

    //4. Complete the add flow calling the function didMoveToParentViewController 
    [detailVC didMoveToParentViewController:self]; 

} 


- (void)removeCurrentDetailViewController{ 

    //1. Call the willMoveToParentViewController with nil 
    // This is the last method where your detailViewController can perform some operations before neing removed 
    [self.currentDetailViewController willMoveToParentViewController:nil]; 

    //2. Remove the DetailViewController's view from the Container 
    [self.currentDetailViewController.view removeFromSuperview]; 

    //3. Update the hierarchy" 
    // Automatically the method didMoveToParentViewController: will be called on the detailViewController) 
    [self.currentDetailViewController removeFromParentViewController]; 
} 

- (CGRect)frameForDetailController{ 
    // newFrame's height should be currentFrame's height minus buttons' height 

    CGRect detailFrame = CGRectMake(0, 0, self.detailView.bounds.size.width, self.detailView.bounds.size.height-self.btnOne.frame.size.height); 
    return detailFrame; 
} 

- (void)addDetailController:(id)sender { 
    FirstViewController *detailVC = [[FirstViewController alloc]initWithString:@"First button clicked"]; 

    [self presentDetailController:detailVC]; 

} 




@end 

FirstViewController.h

#import <UIKit/UIKit.h> 
@class ViewController; 

@interface FirstViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *label; 
@property (weak, nonatomic) IBOutlet UIButton *btnOne; 
@property (weak, nonatomic) IBOutlet UIButton *btnTwo; 
@property (weak, nonatomic) IBOutlet UIButton *btnThree; 


- (id)initWithString:(NSString*)string; 

@end 

FirstViewController.m

#import "FirstViewController.h" 

@interface FirstViewController(){ 
    NSString *text; 
} 
@end 

@implementation FirstViewController 

- (id)initWithString:(NSString*)string { 
    self = [super init]; 

    if(self){ 
     text = string; 
    } 

    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.label.text = text; 

} 


@end 

Main View Controller First View Controller

+0

我没有看到任何可能导致您的视图无法显示的主要问题。只要确保你所有的插座都正确连接。它在我的工作很好。 – atulkhatri 2015-04-01 12:31:20

+0

再次检查,网点链接良好...我真的不明白,谢谢你的回答 – user3673449 2015-04-01 13:53:20

回答

0

在创建FirstViewController,你调用[super init]产生裸UIViewController的一部分。从您的图表中,您似乎想要从故事板加载FirstViewController

我建议使用instantiateViewControllerWithIdentifier:创建控制器的顺序,然后在控制器中设置一个字符串属性作为标签,最后在控制器的视图加载时将字符串分配给标签。

+0

这样工作。谢谢! – user3673449 2015-04-01 14:38:55