следующий контроллер представления не загружается при выполнении перехода

Я все еще новичок в раскадровке. Я потратил два дня на отладку этой проблемы. Кажется, что контроллер представления назначения перехода не работает должным образом, когда вызывается -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender.

У меня есть представление таблицы, и когда ячейка нажимается, она требует перехода

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    VAItem *item = [category itemAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"SegueShowDetail" sender:item];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {

        VADetailViewController *detailViewController = segue.destinationViewController;
        detailViewController.item = (VAItem*) sender; // <-- THIS ASSIGNMENT DOES NOT WORK       
    }
}

Моя отладка показывает, что item правильно передается prepareForSegue, но detailViewController.item является диким указателем. Он не инициализирован, и назначение = не имеет никакого эффекта.

Я поставил точку останова в viewDidLoad VADetailViewController и обнаружил, что переменная item по-прежнему является адресом дикого указателя, хотя назначение имело место.

@interface VADetailViewController : UIViewController
// data
@property (nonatomic, retain) VAItem *item;
@end

элемент также правильно синтезируется.

Любая помощь высоко ценится

Лео


person leo    schedule 26.03.2012    source источник
comment
кажется, что в xcode есть ошибка, которую отладчик показывает, что назначение не вступило в силу, но на самом деле это произошло   -  person leo    schedule 28.03.2012


Ответы (2)


Если вы используете переход раскадровки для перехода к следующему контроллеру представления, вам не нужно использовать tableVeiew:didSelectRowAtIndexPath: в этой ситуации. В зависимости от того, как у вас настроены вещи, которые могут способствовать возникновению проблемы.

В своей раскадровке убедитесь, что вы нарисовали переход от ячейки прототипа вашего табличного представления к контроллеру подробного представления (то есть из ячейки, НЕ из tableViewController). Если у вас настроена раскадровка таким образом, ваш переход будет запущен, как только пользователь выберет ячейку. Ссылка на саму ячейку будет передана в prepareForSegue:sender: в качестве параметра sender. Затем вы можете проверить этот объект, чтобы узнать, какая строка была нажата в этом методе.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {

        // sender will be the tableview cell that was selected
        UITableViewCell *cell = (UITableViewCell*)sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

        VAItem *item = [category itemAtIndex:indexPath.row];

        VADetailViewController *detailViewController = segue.destinationViewController;
        detailViewController.item = item;       
    }
}
person jonkroll    schedule 26.03.2012
comment
Я хотел использовать didSelectRowAtIndexPath, потому что нажатие на одну из моих ячеек вызывает телефонный номер. Я не знаю, как я могу создать переход в раскадровке, если у меня нет для этого целевого контроллера представления в моем приложении. - person leo; 27.03.2012

Вы действительно хотите использовать только один из

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

чтобы передать ваши данные следующему контроллеру представления. Если вы хотите использовать последнее в своем случае, вам нужно изменить свой код на что-то вроде:

if ([segue.identifier isEqualToString:@"SegueShowDetail"]) {

    VADetailViewController *detailViewController = segue.destinationViewController;
    detailViewController.item = [catagory itemAtIndex:[self.tableView indexPathForSelectedRow].row];
}

Я думаю, вы получили сообщение об ошибке из-за того, что вы назначили отправителя. Вот ссылка на документы, которые объясняют, каким должен быть «отправитель».

https://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/performSegueWithIdentifier:sender :

Надеюсь это поможет.

person Jamie    schedule 26.03.2012