Как использовать didSelectRowAtIndexPath в target-c - PullRequest
1 голос
/ 07 ноября 2011

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

Что-нибудь привлекает внимание этим кодом? Или у вас есть пример кода? Я использую Xcode 3 с симулятором 4.3.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSInteger row = [indexPath row];
        if (self.vailViewController == nil) {
            VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
            self.vailViewController = vailView;
            [vailView release];
        }

        vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
        Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
        [delegate.resortsNavController pushViewController:vailViewController animated:YES];
        [self.navigationController pushViewController:vailViewController animated:YES];
}

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 07 ноября 2011

Убедитесь, что vailViewController сохраняется.

@property (retain) VailViewController *vailViewController;

Кроме того, сохраняется ли resortsNavController в Ski_AdvisorAppDelegate? Как определяется это свойство?

Кроме того, UITableViewController является корневым контроллером UINavigationController? Если это так, вы сможете вызвать [self navigationController]

[[self navigationController] pushViewController:detailedView animated:YES];

Обычно я делаю это в своем приложении. Заявка:

_mainTableViewController = [[MainTableViewController alloc] init];
_navController = [[UINavigationController alloc] initWithRootViewController:_mainTableViewController];
0 голосов
/ 07 ноября 2011
if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

В этом блоке кода находится ваш файл представления, который на самом деле называется «View.xib», потому что если нет, то это ваш сбой.С этим сообщением об ошибке

* Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удалось загрузить NIB в комплекте:« NSBundle (загружен) »с именем« Просмотреть''

Итак, если вы хотите загрузить это с помощью initWithNibName, и ваши файлы будут иметь такие имена:

VailViewController.h VailViewController.m VailViewController.xib

выneed:

VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"VailViewController" bundle:nil];

Однако, если это стандартный подкласс UIViewController, вам нужно всего лишь сделать:

VailViewController *vailView = [[VailViewController alloc] init];

Вышеприведенное работает, если вы только что создали подкласс UIViewController в Xcode и didn 'не могу ничего изменить.Контроллер представления знает, как загрузить свой собственный вид.Если он у вас есть, создайте файл .xib для вас, и вы что-то удалили в нем, или просто не уверены, что убедитесь, что Владелец файла подключен к корневому представлению в файле .xib в интерфейсе bulder.

Я надеюсь, что это помогает.

Редактировать:

Ошибка в ваших комментариях:

* Завершение работы приложенияк необработанному исключению 'NSInvalidArgumentException' причина: 'Не поддерживается одновременное нажатие одного и того же экземпляра контроллера представления

: в вашем коде появляются следующие две строки:

[delegate.resortsNavController pushViewController:vailViewController animated:YES];
[self.navigationController pushViewController:vailViewController animated:YES];

Iследует спросить, если это два разных контроллера навигации?если да, то зачем им нужен один и тот же контроллер представления?

Я бы удалил один из них, а затем он должен выдвинуть контроллер представления без ошибки.

0 голосов
/ 07 ноября 2011

Что такое aBookDetail? Кажется, что вы, возможно, не помещаете VailViewController в стек, как вы думаете. Код ниже может быть больше, чем вы хотите. Кроме того, дает ли отладчик какую-либо информацию об ошибке в случае сбоя?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger row = [indexPath row];
    if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

    self.vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
    Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
    [delegate.resortsNavController pushViewController:self.vailViewController animated:YES];
}
...