2014-01-25 2 views
0

Теперь я создаю приложение для iOS на базе Core Data и хочу, чтобы пользователь нажимал на ячейку в UITableViewController, которая основана на Core Data и NSFetchedResultsController, чтобы заставить его перейти к другому контроллеру представления, и он может видеть детали.Перейдите к другому контроллеру представления, используя prepareForSegue: sender: или tableView: didSelectedRowAtIndexPath:

В приложении шаблона шаблона Master-Detail iOS, когда пользователь нажимает на какие-либо ячейки, контроллер просмотра перемещается к контроллеру подробных представлений с помощью раскадровки segue для отображения подробных элементов.

Однако я не знаю, почему этот метод, prepareForSegue: sender:, может реагировать на нажатие пользователя и вызываться для перехода к подробному представлению. Если вы используете UITableView, существует также один метод делегата tableView: didSelecteRowAtIndexPath:, который должен точно реагировать на действие пользователя.

Фактически, когда я попытался написать последний метод, чтобы перейти к контроллеру подробного представления, переход завершился неудачно, так как я, по-видимому, назвал оба метода одновременно.

Так что мой вопрос, 1), как метод prepareForSegue: sender: может реагировать на действия касания пользователя и, соответственно, обрабатывать его внутреннюю реализацию, и 2) если я могу использовать как prepareForSegue: sender: и tableView: didSelecteRowAtIndexPath:, которые следует использовать?

Независимо от способов использования, я хочу использовать NSFetchedResultsController для извлечения подробных данных прослушиваемой ячейки из Persistent Store и отображения их в подробном контроллере представления. Если это так, то где я должен писать извлеченный код (либо в том или ином методе выше, либо в методе viewDidLoad: контроллера детального представления)?

Я использую iOS 7 и Xcode 5. Спасибо.

+0

Удаленный ответ, потому что путаница в именах методов сделала мой ответ полностью вне базы. Я отправлю новый ответ. – nhgrif

ответ

2

Если вы подключите свой переход от одного контроллера вида к другому, а не непосредственно от элемента пользовательского интерфейса, вы можете использовать performSegue:withIdentifier: для выполнения разговора точно, когда вам нужно, чтобы он выполнялся.

Итак, в случае просмотра таблицы в другом виде, в методе didSelectRowAtIndexPath: вы собираете некоторые данные из выбранной строки, чтобы подготовить их для отправки на контроллер представления назначения.

Затем в конце этого номера вы звоните performSegue:withIdentifer:.

Как часть процесса segue, вызывается prepareForSegue:sender: (в данном случае, вызываемый в исходном контроллере табличного представления). В рамках этого метода у вас есть ссылка на контроллер представления исходного кода (через self) и контроллер точки назначения (через [segue destinationViewController]), поэтому именно в этом методе вы передаете данные с по номеру [segue destinationViewController].

По существу, вы должны использовать didSelectRowAtIndexPath: для обработки любой логики выбора строки и подготовить данные, которые вы хотите передать (сохранить его в @property возможно), то в prepareForSegue, необходимо выполнить всю логику, необходимую для передачи данных.

+0

Спасибо. Но мой вопрос: КАК может метод 'prepareForSegue: sender:' воспринимать действие пользователя? В какой момент предлагается метод? Я не пишу ни одного кода для распознавания действия пользователя, например 'tableView: didSelectRowAtIndex:', но функция segue хорошо работает с помощью метода 'prepareForSegue: sender:'. Я хотел бы знать, почему этот метод может воспринимать кран пользователя и начать обрабатывать соответственно. – Blaszard

+0

'prepareForSegue: отправитель:' не воспринимает кран пользователя. 'prepareForSegue: отправитель:' вызывается, потому что что-то еще воспринимает пользователя и выполняет сеанс. 'prepareForSegue' вызывается, потому что segue вот-вот произойдет. Если это происходит без явного вызова 'performSegue:' в вашем коде, то это происходит, потому что вы подключили segue до элемента пользовательского интерфейса в своем построителе интерфейса, а не из самого контроллера представления. – nhgrif

+0

Итак, SDK iOS или что-то в нижнем уровне автоматически связывает действие пользователя с нажатием на UITableViewCell с расписанием segue, и мне не нужно это учитывать, не так ли? – Blaszard

Смежные вопросы