2015-05-08 21 views
0

我正在嘗試爲iOS創建一個View工廠,並且我陷入了一些麻煩。視圖工廠應該能夠創建多個UIImageViews,MKMapViews或UIWebViews並將它們垂直添加到視圖中。我有一個Web視圖的問題,因爲我不得不等待webViewDidFinishLoad。如果方法在實現UIWebViewDelegate的ViewController中實現,並且將webviews的委託設置爲控制器,則一切正常。問題是我想把所有這些都放在一個單獨的類中,但是從來沒有調用過webViewDidFinishLoad。有沒有辦法實現這一點? 部分增加創建查看工廠對於iOS

- (void)addPart 
{ 
    if (self.viewPartStrings.count != 0) { 
    NSString *viewPartString = [self.viewPartStrings objectAtIndex:0]; 
    NSString *viewPartIdentifier = [self getViewPartIdentifier:viewPartString]; 
    NSString *viewPartDefinition = [self getViewPartDefinition:viewPartString]; 
    if ([viewPartIdentifier isEqualToString:kWeb]) { 
     [self createTextWebViewPart:viewPartIdentifier]; 
    } else if ([viewPartIdentifier isEqualToString:kMap]) { 
     [self createMapViewPart:viewPartDefinition]; 
    } else if ([viewPartIdentifier isEqualToString:kImage]) { 
     [self createImageViewPart:viewPartDefinition]; 
    } 
    } 
} 

瀏覽次數:

- (void)createTextWebViewPart:(NSString *)viewPartText 
{ 
    WebViewPart *webViewPart = [[WebViewPart alloc]initWithFrame:[self getViewPartFrameForHeight:0]]; 
    [webViewPart createViewForText:viewPartText]; 
    [webViewPart setDelegate:self]; 
} 

- (void)createImageViewPart:(NSString *)viewPartDefinition 
{ 
    //create image 
} 

- (void)createMapViewPart:(NSString *)viewPartDefinition 
{ 
    //create map 
} 

但這裏是一點,如果你需要任何代碼

代碼 告訴我。這種方法從來沒有被調用。若該類擴展NSObject的,而不是如果類擴展的UIView:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    CGRect frame = webView.frame; 
    frame.size.height = 1; 
    webView.frame = frame; 
    CGSize fittingSize = [webView sizeThatFits:CGSizeZero]; 
    frame.size = fittingSize; 
    [webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"]; 
    int height = frame.size.height + 70; 
    [self addToView:webView forHeight:height]; 

} 

編輯:我也試過在控制器這樣做:

@interface DetailController() 
@property (nonatomic, strong) ViewPartsFactory *viewPartsFactory; 
@end 

然後:

- (void)setViewForModel:(DealModel *)model 
{ 
    //... 
    self.viewPartsFactory = [[ViewPartsFactory alloc]initWithViewParts:      [descriptionParser getViewParts]]; 
    UIView *view = [self.viewPartsFactory getView] 
    [scrollView addSubview:view]; 
    //.. 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [self.viewPartsFactory webViewDidFinishLoad:webView]; 
} 

設置webview委託給控制器,但仍然沒有。

+0

如果您至少可以在代碼中提供一個高級示例,那麼這將有所幫助。很難明白你的問題是什麼。 – brandonscript

+0

我已經添加了一些代碼 – alecnash

+0

啊。既然你把它放在另一個類中,你將不得不在新類中添加你自己的委託方法,並將它們連接到視圖控制器。 – brandonscript

回答

0

我會在超僞代碼中回答這個問題,並希望它能給你一個我建議的想法。

// ViewPartsFactory.h 

-(void)webViewDidFinishLoad; // implement your logic in this method 
// Ensure you DO NOT set the delegate anywhere here, otherwise it'll override when you set it in the view controller. 

//--------------------------------------------------// 

// DetailController.m 

@property (nonatomic, weak) id <UIWebViewDelegate> delegate; 
DetailController <UIWebViewDelegate> 

-(void)viewDidLoad { 
    self.delegate = viewPartsFactory; 
} 
+0

我試過了,但webViewDidFinishLoad永遠不會被調用,我不知道爲什麼 – alecnash

+0

好的,你可以添加你已經連接到你的代表原來的問題的方式嗎?不需要任何邏輯,只需要@interface中的聲明 – brandonscript

+0

剛剛更新了問題 – alecnash