Проблемы с созданием и использованием делегат-протоколов - PullRequest
0 голосов
/ 23 января 2010

У меня проблема в том, что я создал протокол делегата, но необходимые методы не выполняются, хотя я реализовал протокол в своем заголовочном файле. Вот подробное объяснение:

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

Все выглядит так:

WebViewTableCellDelegate.h:

@protocol WebViewTableCellDelegate
-(void)loadWeb;
@end

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

  id <WebViewTableCellDelegate> _delegate;

В .m TableViewCell:

 @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
- (void)setDelegate:(id <WebViewTableCellDelegate>)delegate{
    _delegate = delegate;}

И в моем TimeLineViewController я реализовал протокол с помощью <> и метод loadWeb:

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

И когда экземпляр TableViewCell будет создан в TimelineViewController:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";
    MyIdentifier = @"tableCell";
    TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if(cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
        cell = tableCell;}

    [cell setDelegate:self];
//…
}

Я впервые создал собственный протокол делегата, так что, возможно, есть глупые ошибки. Также я изучаю Objective-C и программирование, как правило, всего за 4 недели.

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: Я думаю, что нашел проблему, но я не знаю, как ее решить. Я пытаюсь использовать [_delegate loadWeb]; в подклассе UITextView (потому что это единственный способ, которым я могу реагировать на ссылки), и подкласс не может использовать [_delegate loadWeb];. Я попробовал это другим способом, и это сработало.

1 Ответ

0 голосов
/ 23 января 2010

Ваша первая проблема заключается в том, что:

id <WebViewTableCellDelegate> *_delegate;

должно быть:

id <WebViewTableCellDelegate> _delegate;

Тип id уже является указателем на экземпляр.

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