Как может экземпляр UITableViewCell, который был создан экземпляром моих ViewControllers, сказать ViewController, что-то сделать? - PullRequest
1 голос
/ 21 января 2010

Я создал экземпляр моего ViewController (TimeLineViewController), который будет представлен. Этот ViewController содержит UITableView, который получает ячейки из экземпляра моего TableViewCell. Таким образом, ViewController создает экземпляр TableCellView. TableViewCell содержит UITextView с включенными веб-ссылками. Теперь я хочу отключить функцию, которую открывает Safari. Я сделал подкласс UITextView и:

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{   NSLog(@"request: %@", request); //Console shows the link
}

Теперь я хочу, чтобы при нажатии на веб-ссылку появился новый ViewController (WebViewController). Проблема в том, что TableViewCell не может «открыть» новый ViewController. Итак, я попробовал это: В TableViewCell:

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{   NSLog(@"request: %@", request);
    TimeLineViewController * web = [[TimeLineViewController alloc]init];
    [web loadView];
}

А в ViewController:

- (void)loadWeb{
    WebViewController *lust = [[WebViewController alloc] initWithNibName:nil bundle:nil];
    lust.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:lust animated:YES];
    [lust release];
}

Проблема в том, что он всегда просто перезагружает TimeLineViewController, но не загружает WebViewController. Зачем? Как я могу это исправить? (Я знаю, что WebViewController не получает ссылку в моем опубликованном коде, и я знаю, как это сделать. Когда я знаю, как решить мою проблему, это не должно быть проблемой.)

Спасибо за вашу помощь! Если у вас есть вопросы, просто спросите - извините за мой плохой английский.

UPDATE : Я сделал то, что Фрэнк упоминает, но я не работаю. Я создал WebViewTableCellDelegate.h с:

@protocol WebViewTableCellDelegate
-(void)loadWeb;
@end

Затем я создал переменную экземпляра WebViewDelegate в TableViewCell:

__weak NSObject <WebViewTableCellDelegate> *_delegate;

и в .m:

@interface UITextView (Override)
@end

@class WebView, WebFrame;
@protocol WebPolicyDecisionListener;

@implementation UITextView (Override)

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener
{   NSLog(@"request: %@", request);
    [_delegate loadWeb];
}

@end

В моем TimeLineViewController я реализовал WebViewTableCellDelegate с помощью <> и в строке, где я создаю ячейки, я установил для владельца значение self:

  TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if(cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
        cell = tableCell;
    }

Почему это не работает? Нет предупреждения об ошибке.

Ответы [ 2 ]

2 голосов
/ 21 января 2010

Я бы сделал следующее:

  1. Создайте протокол WebViewTableCellDelegate (посмотрите, как создать протокол на сайте Apple). Протокол должен включать ваш loadWeb: метод.
  2. Пусть ваш TimeLineViewController реализует протокол и передаст вашему подклассу UITextView переменную экземпляра типа <WebViewTableCellDelegate>.
  3. При создании ячейки табличного представления установите для ее делегата значение self (TimeLineViewController).
  4. Когда кто-то нажимает на ссылку, звоните [delegate loadWeb:request]
  5. Пусть ваш метод loadWeb: примет NSURLRequest и загрузит его в веб-представление.

Это должно сработать.

1 голос
/ 21 января 2010

Я не думаю, что было бы хорошей идеей ставить UIWebView в каждую клетку. Рассмотрим реализацию, в которой вы просто используете метод tableView:didSelectRowAtIndexPath: в протоколе UITableViewDelegate для представления вашего UIWebView при касании конкретной ячейки.

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