Невозможно отобразить дочернее представление (контейнер представления iOS)

В моем приложении для iOS у меня есть основной контроллер представления с тремя кнопками, которые работают как панель вкладок: когда я нажимаю одну из кнопок, вызывается новый контроллер представления. Я попытался реализовать это с помощью контейнеров представления контейнера, поэтому я попытался следовать этому руководству (http://www.thinkandbuild.it/working-with-custom-container-view-controllers/) и вызовите метод presentDetailController в viewDidLoad главного контроллера.

На самом деле просмотры не отображаются: кто-нибудь может помочь мне понять, почему? Спасибо.

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

Фирствиевконтроллер.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

Фирствиевконтроллер.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

Контроллер основного представленияКонтроллер первого представления


person user3673449    schedule 01.04.2015    source источник
comment
Я не вижу какой-либо серьезной проблемы, которая может привести к тому, что ваши взгляды не будут отображаться. Просто убедитесь, что все ваши розетки подключены правильно. На моем конце он работает нормально.   -  person atulkhatri    schedule 01.04.2015
comment
Проверил еще раз, розетки связаны хорошо... Я действительно не понимаю, все равно спасибо за ответ   -  person user3673449    schedule 01.04.2015


Ответы (1)


В рамках создания FirstViewController вы вызываете [super init], который создает голый UIViewController. Из вашей диаграммы кажется, что вместо этого вы хотите загрузить FirstViewController из своей раскадровки.

Я предлагаю последовательность, в которой вы создаете свой контроллер с помощью instantiateViewControllerWithIdentifier:, затем устанавливаете строковое свойство в контроллере, которое хотите использовать в качестве метки, и, наконец, назначаете строку метке при загрузке представления контроллера.

person Phillip Mills    schedule 01.04.2015
comment
Работал так. Спасибо! - person user3673449; 01.04.2015