Пользовательский вид iPhone SDK, загруженный из XIB, не отображается? - PullRequest
1 голос
/ 08 августа 2011

Я создал пользовательскую иерархию представлений в XIB, которую я хочу разместить в представлении различных других контроллеров представлений.Подсказки от SO указывают, что я должен явно добавить в качестве подпредставления.XIB загружается и просматривает его в отладчике, выглядит корректно, однако есть две проблемы.Во-первых, он определяет только верхний уровень UIView моего пользовательского XIB, и он не отображается.Я специально наложил другой цвет фона, чтобы сделать его очевидным.Код родительского «OtherViewController», который пытается загрузить это настраиваемое представление в качестве заголовка, выглядит следующим образом:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    NSLog(@"%s", __FUNCTION__  );
    if (self) {
        // Custom initialization
        appDelegate = (myProjectAppDelegate*) [[UIApplication sharedApplication] delegate];

        NSObject *obj = [[NSBundle mainBundle] loadNibNamed:@"PageHeaderView" owner:self options:nil];
        NSArray *array = nil;

        if ([obj isKindOfClass:[NSArray class]]) {

            array = (NSArray*) obj;

            for (UIView *customView in array) {
                NSLog(@"%@", customView);
                if ((customView.tag == 3700) && ([customView isKindOfClass:[PageHeaderView class]])) {
                    [self setCustomPageHeaderView: (PageHeaderView*) customView];
                    [self.view addSubview: customPageHeaderView];
                    [self.view bringSubviewToFront: customView];
                }

                NSArray *array = [self.customPageHeaderView subviews];
                for (NSObject *obj in array) {
                    NSLog(@"%s: \t%@", __FUNCTION__, obj);
                }
            }
        } else { 
            NSLog(@"%s: object following loadNibNamed is [%@]", __FUNCTION__, [obj class]);
        }

    }

    return self;
}

TAG = 3700 снова должен был содержать очевидный бит информации в отладчике.Это отображается в пользовательском представлении, как и ожидалось.

1 Ответ

3 голосов
/ 08 августа 2011

При первом обращении к свойству self.view контроллер представления лениво загружает свое представление, вызывая loadView, который по умолчанию загружает представление из NIB.Получая доступ к self.view в вашем методе initWithNibName:bundle:, вы просите контроллер представления загрузить свое представление еще до того, как контроллер даже завершил инициализацию.

Попробуйте переместить этот код в viewDidLoad:.Это гарантирует, что к моменту обращения к нему self.view уже загружен ленивыми.

...