2015-08-21 4 views
1

У меня есть методы протоколов во всех моих viewControllers, которые работают точно так же, что они делают на моем viewController. Я хотел бы назвать их и передать viewController в качестве параметра, вместо того, чтобы переопределять их из подклассов и писать один и тот же код снова и снова. Это возможно? Как это сделать? Например, в приведенном ниже методе я хотел бы передать дочерний элемент viewController в качестве параметра, выполнить его итерацию и выполнить на нем некоторые предложения. Если бы я мог это сделать, мне не нужно было бы переписывать этот код один раз и другой в каждом подклассе. Это возможно?Переопределить и изменить методы протоколов

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    //iterate an array of subviews and finds indicator 
    NSArray *subviews = [self.view subviews]; 

    for (UIView *subview in subviews) 
    { 
     if([subview isKindOfClass:[UIActivityIndicatorView class]] && [subview respondsToSelector:@selector(stopAnimating)]) 
     { 
      [subview performSelector:@selector(stopAnimating)]; 
     } 
    } 


    CGSize contentSize = webView.scrollView.contentSize; 
    CGSize viewSize = self.view.bounds.size; 

    float rw = viewSize.width/contentSize.width; 

    webView.scrollView.minimumZoomScale = rw; 
    webView.scrollView.maximumZoomScale = rw; 
    webView.scrollView.zoomScale = rw; 

} 
+0

не лучшее решение, будет ли это поместить код в общем супер классе? –

+0

Этот код, который я показал выше, находится в суперклассе. Но он делает что-то на контроллере представления, поэтому мне нужно переписать его на child viewControllers, поскольку я не могу передать дочерний элемент viewController в качестве параметра. Я ищу альтернативу для этого. – user3033437

+0

Я не понимаю ... Почему бы вам не сделать то, что вы хотите сделать на вашем viewController в своей реализации суперкласса? –

ответ

0

Если у вас есть подклассы с тем же кодом, то этот код принадлежит их суперклассу. Однако их суперкласс не должен быть UIViewController.

Так вывести класс из UIViewController под названием BaseViewController (или любой другой) и осуществлять webViewDidFinishLoad: в этом суперкласса, используя код, который вы показать в вашем вопросе, а затем вывести все свои подклассы от BaseViewController. Не забудьте сделать BaseViewController в соответствии с любыми протоколами, с которыми вы имеете дело.

Если подклассы действительно нужно что-то добавить к реализации webViewDidLoad: затем реализовать его в подклассе вызова метода суперкласса, где когда-либо соответствующим образом:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // Some code here 
    [super webViewDidFinishLoad:webView]; 
    // And/or here 
} 
+0

код, показанный выше, относится к суперклассу, но этот код работает на контроллере представления, поэтому я хотел бы передать его в качестве аргумента, тогда мне нужно было бы вызвать [super webViewDidFinishLoad: (UIWebView *) webView] ; из контроллеров просмотра детей, поэтому то, что я хотел бы сделать, это эквивалент [super webViewDidFinishLoad: (UIWebView *) webView withSelfViewController: (UIViewController *) self]; – user3033437

+0

Я не понимаю вашу точку зрения. Если вы реализуете эту функциональность в общем базовом классе, тогда все будет сделано для вас. – trojanfoe

+0

Моя проблема заключается в том, что этот код делает что-то прямо на viewController, поскольку он запускается, поэтому, если я вызываю [super webViewDidFinishLoad:] это контроллер дочернего представления, мне нужно передать дочернее представление в качестве параметра или переписать весь код в childViewController и выполнить его оттуда, потому что этот метод делает вещи в представлении. Я ищу эквивалент передачи представления в качестве параметра, потому что я не могу передать его как параметр или я не знаю, как это сделать. – user3033437

Смежные вопросы