контроллер следующего вида не загружается при выполнении перехода - PullRequest
1 голос
/ 26 марта 2012

Я все еще новичок в раскадровке. Я потратил два дня на устранение этой проблемы. Кажется, что контроллер вида назначения segue не работает должным образом, когда вызывается -(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

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

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

Leo

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

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

В вашей раскадровке убедитесь, что вы перетащили свою push-передачу из ячейки прототипа вашего табличного представления в контроллер подробного представления (то есть из ячейки НЕ из 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;       
    }
}
0 голосов
/ 26 марта 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:

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

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