簡體   English   中英

由我的ViewController實例創建的UITableViewCell實例如何告訴ViewController做某事?

[英]How can an instance of an UITableViewCell, which was created by an instance of my ViewControllers, tell the ViewController, to do something?

我創建了ViewController(TimeLineViewController)的實例,該實例將被呈現。 這個ViewController包含一個UITableView,它從我的TableViewCell實例獲取單元格。 因此,ViewController將創建TableCellView的實例。 TableViewCell包含具有啟用的Web鏈接的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
}

現在,我希望通過單擊Web鏈接來顯示一個新的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在我發布的代碼中沒有Web鏈接,而且我知道該怎么做。當我知道如何解決問題時,這不應該是問題。)

謝謝你的幫助! 如有疑問,請問-對不起,我的英語不好。

更新 :我做了弗蘭克所說的,但是我沒有用。 我用以下命令創建了一個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中,我用<>實現了WebViewTableCellDelegate,並在創建單元的那一行中,將所有者設置為self:

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

為什么不起作用? 沒有錯誤警告。

我將執行以下操作:

  1. 創建一個WebViewTableCellDelegate協議(在Apple網站上查找如何創建協議)。 該協議應包含您的loadWeb:方法。
  2. 讓您的TimeLineViewController實現該協議,並為您的UITextView子類提供一個<WebViewTableCellDelegate>類型的實例變量。
  3. 創建表格視圖單元格時,請將其委托設置為self (TimeLineViewController)。
  4. 當有人點擊鏈接時,請致電[delegate loadWeb:request]
  5. 讓您的loadWeb:方法接受一個NSURLRequest並將其加載到Web視圖中。

這應該夠了吧。

我認為在每個單元格中放置UIWebView不是一個好主意。 考慮一個實現,在該實現中,您可以簡單地利用UITableViewDelegate協議中的tableView:didSelectRowAtIndexPath:方法來顯示特定的單元格時顯示的UIWebView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM