Вызов UINavigationController из подпредставления в UITableViewCell

У меня есть табличное представление, в котором я разделил ячейки на подклассы. В эти ячейки я добавляю подвид UIView. При перемещении ячейки я добавляю еще один UIView к подклассу UITableViewCell.

Я хотел бы представить ModalViewController при нажатии кнопки во втором UIView (подпредставление в UITableViewCell). У меня нет контроллера навигации в этом представлении, поэтому я передаю контроллер навигации от контроллера представления, внутри которого находится мое табличное представление, и до моего второго UIView.

Я называю это как обычно, но ничего не происходит.

ComposeCommentViewController *ccvc = [[ComposeCommentViewController alloc] initWithNibName:@"ComposeCommentViewController" bundle:nil];
[navController presentModalViewController:ccvc animated:YES];

Есть ли у кого-нибудь идеи, что я могу сделать не так или есть другое решение?

РЕДАКТИРОВАТЬ: вот как я установил navController

Сначала я передаю его своему подклассу UITableViewCell.

if (feedCell == nil)
{
    feedCell = [[FeedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    [feedCell setNavigationControllerForSlidedView:[self navigationController]];
}

У подкласса есть метод setNavigationControllerForSlidedView:, который выглядит так:

- (void)setNavigationControllerForSlidedView:(UINavigationController *)navController
{
    [feedSlidedView setNavController:navController];
}

В моем FeedSlidedView я заявил и синтезировал UINavigationController *navController;


person simonbs    schedule 15.08.2011    source источник
comment
Конечно. Я добавил это в исходный пост.   -  person simonbs    schedule 16.08.2011


Ответы (1)


То, как вы это делаете, противоречит практике проектирования MVC (модель-представление-контроллер). У вас есть ряд механизмов для выполнения того, что вы хотите в рамках платформы MVC, которую Apple предоставляет в своем SDK. Вероятно, самым простым, на мой взгляд, было бы добавить целевое действие к кнопке в подпредставлении вашего UITableViewCell. В методе tableView:cellForRowAtIndexPath: вашего контроллера представления добавьте что-то вроде следующего:

[button addTarget:self action:@selector(presentComposeComment:) forControlEvents:UIControlEventTouchUpInside];

В этом случае self будет UIViewController, который отвечает за рассматриваемый UITableView. Затем вы должны включить метод для селектора выше в этот контроллер представления:

- (void)presentComposeComment:(id)sender {
    ComposeCommentViewController *ccvc = [[ComposeCommentViewController alloc] initWithNibName:@"ComposeCommentViewController" bundle:nil];
    [self presentModalViewController:ccvc animated:YES];
}

Обратите внимание, что я отправляю сообщение presentModalViewController:animated: не контроллеру навигации, а скорее контроллеру представления.

person glorifiedHacker    schedule 15.08.2011
comment
Подпредставление в моем UITableViewCell не отвечает на presentModalViewController:animated:, поскольку это подкласс UIView (я делаю это, потому что мне нужно использовать drawRect:). Ваш пример определенно будет лучшим способом, но, к сожалению, в данном случае это невозможно. Вы знаете, есть ли другой способ вызвать UIViewController, отвечающий за UITableView? - person simonbs; 16.08.2011
comment
Если вы посмотрите на мой ответ выше, я заявил, что метод presentComposeComment: входит в UIViewController, отвечающий за UITableView. UIViewController - это цель для кнопки, а UIViewController - это то место, где вам нужно разместить код presentComposeComment :. - person glorifiedHacker; 16.08.2011
comment
Хорошо, я пробовал это, но не уверен, что понимаю, что вы имеете в виду. Я поместил presentComposeComment: в контроллер представления, в котором находится мое табличное представление. В моем UITableViewCell я вызвал кнопку в подпредставлении и добавил к ней цель следующим образом: [[feedSlidedView composeButton] addTarget:self action:@selector(presentComposeComment:) forControlEvents:UIControlEventTouchUpInside]; при этом мое приложение выйдет из строя с Unrecognized selector sent to instance. self экземпляром ячейки. - person simonbs; 16.08.2011
comment
Не размещайте код для добавления целевого действия к кнопке внутри вашего пользовательского UITableViewCell. Поместите этот код в контроллер представления - tableView:cellForRowAtIndexPath: - хорошее место для этого. - person glorifiedHacker; 16.08.2011
comment
Ах да, конечно! В этом есть смысл. Большое спасибо за вашу помощь и терпение. Я очень ценю это. - person simonbs; 16.08.2011
comment
Обратите внимание, что вы должны отправить сообщение addTarget: action: forControlEvents: на кнопку при создании новой ячейки, но не при повторном использовании существующей ячейки, поскольку для кнопки в существующей ячейке уже будет задано целевое действие. - person glorifiedHacker; 16.08.2011