вызов addSubview в initWithNibName: вызывает срабатывание viewDidLoad (и других объектов объекта пользовательского интерфейса) до выполнения вызова addSubview - PullRequest
2 голосов
/ 18 октября 2011

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

У меня был такой же опыт, когда я добавлял код кнопки в метод viewDidLoad.В .xib есть UITableView, и таблица инициализируется до того, как запускается остальная часть viewDidLoad, и это приводит к тому, что tableView получает неверные данные.

Как лучше всего добавлять представление в представление, когда выинициируете и загружаете представление?просто поместите все addSubViews перед Return?

Спасибо!

Вот мой initWithNibName: bundle:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{

    self = [super initWithNibName:nibNameOrNil bundle:nil];

    [self setIoUIDebug:(IoUIDebugSelectorNames)];

    if (IoUIDebug & IoUIDebugSelectorNames) {
        NSLog(@"%@ - %@", [self description], NSStringFromSelector(_cmd) );
    }   

    CGRect frame = CGRectMake(20, 521, 500, 37);                                


    saveButton = [UIButton newButtonWithTitle:NSLocalizedStringFromTable(@"Save Animation Label",@"ScreenEditor",@"Save Animation Label")
                                       target:self
                                     selector:@selector(saveButtonPressedAction:)
                                        frame:frame
                                        image:[UIImage imageNamed:@"BlueButtonSmall.png"]
                                 imagePressed:[UIImage imageNamed:@"BlueButtonSmallPressed.png"]
                                darkTextColor:NO];                      

    [self.view addSubview:saveButton];  // <- Right here I'll hit breakpoints in other parts of viewDidLoad and cellForRowAtIndexPath, before the lined below get executed. 
    [saveButton setEnabled: NO];
    [saveButton setUserInteractionEnabled: NO];

    newAnimation = nil;
    selectedSysCDAnimation = nil;
    selectedIoCDTag = nil;
    animationSaved = NO;  
    return self;
}

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Вы должны добавить подпредставления внутри viewDidLoad, это будет означать, что представления добавляются, когда основной вид загружается в память. Я бы зарезервировал ваш initWithNibName:bundle: вызов для пользовательской инициализации и не взаимодействовал с пользовательским интерфейсом, как это то, для чего предназначен viewDidLoad.

Что касается вашего tableView, вы должны вызвать вызов для загрузки источника данных таблиц внутри viewDidLoad. Как только источник данных загружен, вы можете просто вызвать reloadData в табличном представлении, чтобы загрузить данные в табличное представление.

Например:

- (void)viewDidLoad
{

    [super viewDidLoad];

    [self.view addSubview:saveButton];

    [self loadDataSource];

}

- (void)loadDataSource {

  // load datasource here

  [self.tableView reloadData];

}
0 голосов
/ 18 октября 2011

Любой доступ к свойству view контроллера представления лениво инициализирует представление. Это вызовет вызов viewDidLoad, который будет выполнен до того, как доступ к свойству представления вернется в initWithNibName :. Вы должны добавить вложенное представление в viewDidLoad или с помощью построителя интерфейса.

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