创建和使用委托协议的问题

时间:2010-01-23 14:48:21

标签: iphone objective-c xcode

我遇到的问题是我创建了一个委托协议,但是虽然我已经在头文件中实现了协议,但是没有执行必要的方法。以下是详细说明:

我创建了一个我的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];。我在其他方法中尝试了这个并且它有效。

1 个答案:

答案 0 :(得分:0)

你的第一个问题是:

id <WebViewTableCellDelegate> *_delegate;

应该是:

id <WebViewTableCellDelegate> _delegate;

id类型已经是对实例的指针引用。