我遇到的问题是我创建了一个委托协议,但是虽然我已经在头文件中实现了协议,但是没有执行必要的方法。以下是详细说明:
我创建了一个我的ViewController(TimeLineViewController)的实例,它将被显示出来。这个ViewController包含一个UITableView,它又从我的TableViewCell的一个实例接收单个Cell / Rows。因此ViewController创建了一个TableCellView实例。 TableViewCell包含一个UITextView,其中包含Web链接。现在我想,不是safari打开链接,而是我自己的内置浏览器。不幸的是,TableViewCell无法使用WebView打开新的ViewController,所以我决定创建一个委托协议。
整件事看起来像这样:
WebViewTableCellDelegate.h:
@protocol WebViewTableCellDelegate
-(void)loadWeb;
@end
然后我在TableViewCell中创建了一个实例WebViewDelegate:
id <WebViewTableCellDelegate> _delegate;
在TableViewCell的.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
- (void)setDelegate:(id <WebViewTableCellDelegate>)delegate{
_delegate = delegate;}
在我的TimeLineViewController中,我使用&lt;&gt;实现了协议。和loadWeb-metode:
- (void)loadWeb{
WebViewController *web = [[WebViewController alloc] initWithNibName:nil bundle:nil];
web.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController: web animated:YES];
[web release];
}
当在TimelineViewController中创建TableViewCell的实例时:
- (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的子类中(因为这是我可以对weblinks做出反应的唯一方法),子类不能使用[_delegate loadWeb];
。我在其他方法中尝试了这个并且它有效。
答案 0 :(得分:0)
你的第一个问题是:
id <WebViewTableCellDelegate> *_delegate;
应该是:
id <WebViewTableCellDelegate> _delegate;
id
类型已经是对实例的指针引用。