У меня проблема в том, что я создал протокол делегата, но необходимые методы не выполняются, хотя я реализовал протокол в своем заголовочном файле. Вот подробное объяснение:
Я создал экземпляр моего 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];
. Я попробовал это другим способом, и это сработало.