如何通过我的ViewControllers实例创建的UITableViewCell实例告诉ViewController做什么?

时间:2010-01-20 21:43:50

标签: iphone objective-c xcode uitableview

我创建了一个我的ViewController(TimeLineViewController)的实例,它将被呈现。这个ViewController包含一个UITableView,它从我的TableViewCell实例中获取单元格。所以ViewController创建了一个TableCellView的实例。 TableViewCell包含一个启用了weblinks的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没有在我发布的代码中获取weblink,我知道该怎么做。这应该不是问题,当我知道,如何解决我的问题。)

感谢您的帮助!如果您有任何疑问,请询问 - 抱歉我的英语不好。

更新: 我做了弗兰克提到的,但我没有工作。我用:

创建了一个WebViewTableCellDelegate.h
@protocol WebViewTableCellDelegate
-(void)loadWeb;
@end

然后我在TableViewCell中创建了一个WebViewDelegate的实例变量:

__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中,我使用&lt;&gt;实现了WebViewTableCellDelegate。在我创建单元格的行中,我将所有者设置为self:

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

为什么它不起作用?没有错误警告。

2 个答案:

答案 0 :(得分:2)

我会做以下事情:

  1. 创建WebViewTableCellDelegate协议(查找如何在Apple网站上创建协议)。该协议应包含您的loadWeb:方法。
  2. 让TimeLineViewController实现协议,并为UITextView子类提供类型为<WebViewTableCellDelegate>的实例变量。
  3. 当您创建表格视图单元格时,将其委托设置为self(TimeLineViewController)。
  4. 当有人点击链接时,请拨打[delegate loadWeb:request]
  5. 让您的loadWeb:方法接受NSURLRequest并将其加载到网络视图中。
  6. 这应该可以解决问题。

答案 1 :(得分:1)

我不认为在每个单元格中放置UIWebView是个好主意。考虑一种实现,您只需使用tableView:didSelectRowAtIndexPath:协议中的UITableViewDelegate方法在点按特定单元格时显示UIWebView