Отсутствует UITableView после замены в UINavigationController - PullRequest
0 голосов
/ 24 сентября 2010

Я работаю над простым приложением для iPhone уже несколько дней, и мне не удавалось обдумать интерфейс. В частности, у меня есть представление главного меню с ImageView и несколько кнопок, которые в конечном итоге переключатся на другие представления.

В дополнение к главному меню у меня есть подкласс UIViewController под названием Browse_Phone (это универсальное приложение), и он содержит UITableView с именем tableView. В конечном итоге он будет подключен к базе данных, но на данный момент содержимое таблицы жестко запрограммировано. Ниже приведен код делегата таблицы в Browse_Phone.m (большая часть этого кода заимствована из онлайн-примеров):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    NSString *szCell = [[NSString alloc] initWithFormat: @"Row %i", indexPath.row ];

    cell.textLabel.text = szCell;

    [szCell release];

    // Set up the cell
    return cell;
}

// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])
    {
        self.title = @"Browse";
        tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        tableView.delegate = self;
        tableView.dataSource = self;
        self.view = tableView;
    }
    return self;
}

Наконец, в главном окне есть кнопка для смены представления главного меню с контроллером навигации, который использует контроллер Browse_Phone в качестве своего RootViewController (обратите внимание, что [superview отправителя] является представлением главного меню):

- (IBAction)loadBrowse:(id)sender
{
    Browse_Phone *browsePhone = [[[Browse_Phone alloc] initWithNibName:nil bundle:nil] autorelease];
    if(browsePhone.view)
    {
        UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:browsePhone] autorelease];
        CGContextRef context = UIGraphicsGetCurrentContext();
        [UIView beginAnimations:nil context:context];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:window cache:YES];

        [[sender superview] removeFromSuperview];
        [window addSubview:navController.view];

        [UIView commitAnimations];
    }
}

Когда я нажимаю кнопку, видоискатель работает. Отражение происходит, как и ожидалось, и навигационный элемент управления загружен, но таблицы нигде не найти. Я знаю, что создается экземпляр контроллера Browse_Phone, потому что заголовок панели навигации соответствует заголовку таблицы. Когда я использовал этот код в простом приложении, которое только что загрузило контроллеры в didFinishLaunchingWithOptions делегата приложения, он работал просто отлично. Конечно, я знаю, что проблема будет чем-то простым, что я пропустил.

Заранее спасибо,

Ryan

Ответы [ 2 ]

0 голосов
/ 24 сентября 2010

Хорошо, мне кажется, я понимаю проблему;Похоже, что где-то во время создания и инициализации контроллеров представления они устанавливаются в автоматический выпуск, поэтому, когда я явно устанавливаю их в автоматический выпуск, они выходят слишком много раз.Поэтому до того, как таблица получит шанс на рендеринг, количество сохраняемых контроллеров падает до 0, и оно сбрасывается.Удаление автоматического выпуска из инициализации каждого контроллера в loadBrowse решает проблему.Я не могу сказать, что понимаю, почему приложение не просто аварийно завершает работу, но, похоже, проблема пока решена.

0 голосов
/ 24 сентября 2010

Это ваш initWithNibName:bundle: метод.

loadView вызывается после initWithNibName:bundle: и отменяет ваш вид.Вы должны загрузить свое представление в loadView, или, что еще лучше, в подкласс UITableViewController (вместо UIViewController) и позволить ему сделать все за вас.

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