2013-07-01 3 views
-1

visual Как получить ссылку на VC1 изнутри VC4.m?

Я пробовал self.parentViewController.presentingViewController.parentViewController и self.parentViewController.presentingViewController, но они, похоже, не работали.

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

Редактировать: Я также только что открыл через NSLogs, что viewDidLoad в VC4 выполняет до didSelectRowAtIndexPath в VC2, завершает выполнение и установку ссылки делегата, что может объяснить, почему этот подход не работает. Как обеспечить, чтобы следующий VC был нажат только по завершении всех остальных строк в didSelectRowAtIndexPath? И независимо от того, существуют ли другие публичные свойства на VC1, которые уже установлены (не равны нулю) до выбора строки (я только что проверил это с помощью NSLog в didSelectRow в VC2), и они начинают показывать null, когда я пытаюсь доступ к ним через VC4 с помощью любого подхода.

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// Navigation logic may go here. Create and push another view controller. 
/* 
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; 
// ... 
// Pass the selected object to the new view controller. 
[self.navigationController pushViewController:detailViewController animated:YES]; 
*/ 

// set reference to selected convo. it is stored in ConversationsParentVC public property 
self.conversationsParentVC.selectedConvo = self.conversationsParentVC.conversationsArray[indexPath.row]; 

// temp 
AppDelegate *delegate = getAppDelegate; 
delegate.activeVC = self.conversationsParentVC; 
ConversationsParentVC *convosParentVC = (ConversationsParentVC*)delegate.activeVC; 
NSLog(@"boop %@", delegate.activeVC); 
NSLog(@"beep %i", convosParentVC.conversationsArray.count); 
} 

stack trace

+0

Опубликуйте свой исходный код 'tableView: didSelectRowAtIndexPath:'. –

+0

@robmayoff Не очень, но я разместил его. Спасибо, что посмотрели. – mkc842

+0

Вы используете раскадровку? Что такое трассировка стека, когда вызывается «viewDidLoad» VC4? –

ответ

3

При настройке нажимной SEGUE из ячейки просмотра таблицы, то SEGUE пожары перед методом tableView:didSelectRowAtIndexPath: называется. Вам необходимо передать свою информацию на контроллер представления назначения в методе prepareForSegue:sender: контроллера источника.

Кроме того, вы можете найти this answer полезным.

Вы также можете найти его полезно знать, что sender аргумент в prepareForSegue:sender: это вид ячейки таблицы, и вид таблицы indexPathForSelectedRow уже установлен на пути индекса ячейки.

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