覆盖和修改协议方法

Override and modify protocols methods

我的所有 viewController 中都有运行完全相同代码的协议方法,它们在我的 viewController 上执行操作。我想调用它们并将 viewController 作为参数传递,而不是从子类中覆盖它们并一次又一次地编写相同的代码。那可能吗?怎么做? 例如,在下面的方法中,我想传递一个 child 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;

}

如果您有 subclasses 运行 相同的代码,那么该代码属于他们的 superclass。然而他们的 superclass 不一定是 UIViewController.

所以从 UIViewController 派生一个 class 称为 BaseViewController (或其他)并在那个超级 class 中实现 webViewDidFinishLoad:,使用你展示的代码在你的问题中,然后从 BaseViewController 派生你所有的 subclasses。不要忘记使 BaseViewController 符合您正在处理的任何协议。

如果 subclasses 确实需要在 webViewDidLoad: 的实现中添加一些东西,那么在调用 super class 方法的 subclass 中实现它永远合适:

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