mardi 18 août 2015

Objective-c OOP is this the best way to reuse my code from father class?

Im new in OOP and I've read some tutorials and books. I have the concept more or less clear but I haven't seen many examples. I've made a simple webView app which only displays a website and got some tabs and push notifications. It's not the big deal. Almost all the code from father class can be reused, and no need to rewrite it, so I've made some inheritance and overriding solutions to childrens, but I'm would like to know if the way I did it is the correct approach to object oriented way, also with the design and even with the code documentation. I need to show this code in a future job interview and I would like to refine it and also learn about experts from here with with more experience than I have. Any help would be highly appreciated and many thanks!

This is my father class:

//
//  FirstViewController.h
#import <UIKit/UIKit.h>
#import "iAd/iAd.h"
@interface FirstViewController : UIViewController <UIWebViewDelegate,UIGestureRecognizerDelegate, ADBannerViewDelegate, UIScrollViewDelegate>

@property (strong, nonatomic) IBOutlet UITabBarItem *tabInicio;

+(void)viewController:(NSString*)link;
-(void)configureView:(UIViewController*)vista;
-(void)iAdDisplay:(UIViewController*)vista;
-(void)autoResizeWhenRotates:(UIViewController*)vista;
-(void)configureWebView:(UIViewController *)vista withUrlLink:(NSURL *)url;
-(void)showHideStatusBar:(UIViewController*)vista;
-(void)addGestures:(UIViewController*)vista;
-(void)configureToolBar:(UIViewController*)vista;
-(void)addIndicator:(UIViewController*)vista;

@end

And the implementation file:

//
//  FirstViewController.m
//  push
//
//  Created by Alfredo Martin-Hinojal Acebal on 16/03/15.
//  Copyright (c) 2015 Alfredo Martin-Hinojal Acebal. All rights reserved.
//

#import "FirstViewController.h"

@interface FirstViewController ()
@property UIActivityIndicatorView *indicator;
@property UIToolbar *cToolBar;
@property BOOL isHidden;
@end

@implementation FirstViewController
static UITabBarController *static_Tab = nil;
static UIWebView* static_iVar = nil;


- (void)viewDidLoad {
    [super viewDidLoad];

    [self configureView:self];


    //configure autoresize when device rotate
    NSURL *url = [NSURL URLWithString:@"http://hnoslopez.com"];
    [self configureStatic_iVar:self withUrlLink:url];

    //Set tab bar icons
    [[[self.tabBarController.viewControllers objectAtIndex:1] tabBarItem]setImage:[UIImage imageNamed:@"nosotros.png"]];
    [[[self.tabBarController.viewControllers objectAtIndex:2] tabBarItem]setImage:[UIImage imageNamed:@"catalogo.png"]];
    [[[self.tabBarController.viewControllers objectAtIndex:3] tabBarItem]setImage:[UIImage imageNamed:@"blog.png"]];


    self.tabBarController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.tabBarController.view.autoresizesSubviews = YES;





    //Set first tab
    _tabInicio = [[UITabBarItem alloc] initWithTitle:@"Inicio" image:[UIImage imageNamed:@"inicioIcon.png"] tag:0];

    [[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];
    [self.tabBarController setSelectedIndex:0];

    self.tabBarItem = _tabInicio;

}
-(void)configureView:(UIViewController *)vista{

    //configure toolbar
    [self configureToolBar:vista];

    //show hide status bar with a gesture recognizer and an animation
    [self showHideStatusBar:vista];

    //iAd display
    [self iAdDisplay:vista];

    //auto resizing when device rotates
    [self autoResizeWhenRotates:vista];


    //Add gestures
    [self addGestures:vista];


    //Add Indicator
    [self addIndicator:vista];



}
-(void)configureToolBar:(UIViewController *)vista{

    //Add a toolbar, back and reload button...

    UIToolbar *cToolBar = [[UIToolbar alloc] init];

    //auto resizing
    cToolBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingNone;
    cToolBar.autoresizesSubviews = YES;

    cToolBar.frame = CGRectMake(0, 0, vista.view.frame.size.width, 44);
    NSMutableArray *items = [[NSMutableArray alloc] init];

    //Set toolbar properties..
    [cToolBar setBarStyle:UIBarStyleBlack];
    [cToolBar setTranslucent:YES ];
    [cToolBar setTintColor:[UIColor greenColor]];


    //Back Button..
    NSString *backArrowString = @"\U000025C0\U0000FE0E Atrás"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR
    UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStyleDone target:nil action:@selector(goBack)];

    //Reload button..
    UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:nil action:@selector(refreshControl)];
    [right setTintColor:[UIColor greenColor]];

    //Flexible space between buttons..
    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];


    [items addObject:back];
    [items addObject:flexibleSpace];
    [items addObject:right];



    [cToolBar setItems:items animated:NO];

    [vista.view addSubview:cToolBar];


}
-(void)showHideStatusBar:(UIViewController *)vista{
    //Animation performed to hide/show bar when slide your finger..

    if ([vista respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
        // iOS 7
        [vista performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    } else {
        // iOS 6
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
}
-(void)iAdDisplay:(UIViewController*)vista{

    //Display iAd..

    [vista setCanDisplayBannerAds:YES];



    ADBannerView * adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    adView.frame = CGRectOffset(adView.frame, 0, 44);
    adView.delegate = self;

    //resizing
    adView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    adView.autoresizesSubviews = YES;
    [vista.view addSubview:adView];
}
-(void)autoResizeWhenRotates:(UIViewController*)vista{
    vista.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    vista.view.autoresizesSubviews = YES;
}
-(void)addGestures:(UIViewController*)vista{

    //SWIPE DOWN
    UISwipeGestureRecognizer *gest1 = [[UISwipeGestureRecognizer alloc] initWithTarget:vista action:@selector(hideTabBar:)];
    gest1.delegate = self;
    [gest1 setDirection:UISwipeGestureRecognizerDirectionDown];
    [vista.view addGestureRecognizer:gest1];

    //SWIPE UP
    UISwipeGestureRecognizer *gest2 = [[UISwipeGestureRecognizer alloc] initWithTarget:vista action:@selector(showTabBar:)];
    gest2.delegate = self;
    [gest2 setDirection:UISwipeGestureRecognizerDirectionUp];
    [vista.view addGestureRecognizer:gest2];
}
-(void)addIndicator:(UIViewController *)vista{



    //loading indicator
    //  _indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    UIActivityIndicatorView* indicador = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [indicador setCenter:vista.view.center];
    [indicador setHidesWhenStopped:YES];

    //resizing
    indicador.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    indicador.autoresizesSubviews = YES;
    [vista.view addSubview:indicador];

    [indicador startAnimating];
}
-(void)configureWebView:(UIViewController *)vista withUrlLink:(NSURL *)url{

    //Children method to configure children webViews...

    float width = [UIScreen mainScreen].bounds.size.width;

    float height = [UIScreen mainScreen].bounds.size.height;

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, width,height)];
    webView.delegate = self;

    //ADD Delegate to disable lateral scroll
    webView.scrollView.delegate = self;

    //auto resizing
    webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    webView.autoresizesSubviews = YES;

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
    [vista.view addSubview:webView];
}
-(void)configureStatic_iVar:(UIViewController *)vista withUrlLink:(NSURL *)url{

    //Configure father class webView...

    float width = [UIScreen mainScreen].bounds.size.width;

    float height = [UIScreen mainScreen].bounds.size.height;

    static_iVar = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, width,height)];
    static_iVar.delegate = self;

    //ADD Delegate to disable lateral scroll
    static_iVar.scrollView.delegate = self;

    //auto resizing
    static_iVar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    static_iVar.autoresizesSubviews = YES;

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [static_iVar loadRequest:requestObj];
    [vista.view addSubview:static_iVar];
}

#pragma - mark selectors
-(void)goBack{
    NSArray *subviews = [self.view subviews];
    for (UIView *subview in subviews){
        if([subview isKindOfClass:[UIWebView class]] && [subview respondsToSelector:@selector(goBack)])
        {
            [subview performSelector:@selector(goBack)];
        }
    }
}
-(void)refreshControl{
    [super viewDidAppear:YES];

    //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(startAnimating)])
        {
            [subview performSelector:@selector(startAnimating)];
        }
        if([subview isKindOfClass:[UIWebView class]] && [subview respondsToSelector:@selector(reload)])
        {
            [subview performSelector:@selector(reload)];
        }
    }


}
- (void) hideTabBar:(UITabBarController *) tabbarcontroller
{
    //Perform animation to hide tab bar
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    float fHeight = screenRect.size.height;

    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        }
    }
    [UIView commitAnimations];
}

- (void) showTabBar:(UITabBarController *) tabbarcontroller
{

    //Perform animation to show tab bar..

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height - self.tabBarController.tabBar.frame.size.height;


    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];


    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]] )
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        }

    }
    [UIView commitAnimations];
}

+(void)viewController:(NSString*)link{

    //Loads push notification links in first tab..

    NSURL *url = [NSURL URLWithString:link];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

    [static_iVar loadRequest:requestObj];

}
#pragma mark - delegate methods
- (void)webViewDidStartLoad:(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(startAnimating)])
        {
            [subview performSelector:@selector(startAnimating)];
        }
    }


}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
    if([subviews count] == 0)
    {
        return;
    }
    else
    {
        for (UIView *subview in subviews)
        {
            if([subview isKindOfClass:[UIActivityIndicatorView class]] && [subview respondsToSelector:@selector(stopAnimating)])
            {
                [subview performSelector:@selector(stopAnimating)];
            }
        }
    }

}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
    if([subviews count] == 0)
    {
        return;
    }
    else
    {
        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;

}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

    return TRUE;
}

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [scrollView setContentOffset:CGPointMake(0, scrollView.contentOffset.y)];
}
- (BOOL)prefersStatusBarHidden {
    return YES;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

And this is a children viewController:

//
//  SecondViewController.h
//

#import <UIKit/UIKit.h>
#import "iAd/iAd.h"
#import "FirstViewController.h"
@interface secondViewController : FirstViewController <UIWebViewDelegate,UIGestureRecognizerDelegate,ADBannerViewDelegate, UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *secondView;

@property (strong, nonatomic) IBOutlet UITabBarItem *secondTab;


@end

Implementation file:

//
//  SecondViewController.m
//
//

#import "secondViewController.h"
#import "iAd/iAd.h"
@interface secondViewController ()
@property UIActivityIndicatorView *indicador;
@end

@implementation secondViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    [super configureView:self];


    //configure webView
    NSURL *url = [NSURL URLWithString:@"http://ift.tt/1PxkOHF"];
    [self configureWebView:self withUrlLink:url];


    //Configure second tab
    _secondTab = [[UITabBarItem alloc] initWithTitle:@"Nosotros" image:[UIImage imageNamed:@"nosotros.png"] tag:1];

    [[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];
    [self.tabBarController setSelectedIndex:1];
    self.tabBarItem = _secondTab;

}

- (BOOL)prefersStatusBarHidden {
    return YES;
}
-(void)goBack{
    //reloads webView
    NSArray *subviews = [self.view subviews];
    for (UIView *subview in subviews){
        if([subview isKindOfClass:[UIWebView class]] && [subview respondsToSelector:@selector(goBack)])
        {
            [subview performSelector:@selector(goBack)];
        }
    }
}
-(void)refreshControl{
    [super viewDidAppear:YES];

    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
    if([subviews count] == 0)
    {
        return;
    }
    else
    {
        for (UIView *subview in subviews)
        {
            //start animating indicator
            if([subview isKindOfClass:[UIActivityIndicatorView class]] && [subview respondsToSelector:@selector(startAnimating)])
            {
                [subview performSelector:@selector(startAnimating)];
            }
            //reloads webView
            if([subview isKindOfClass:[UIWebView class]] && [subview respondsToSelector:@selector(reload)])
            {
                [subview performSelector:@selector(reload)];
            }
        }
    }
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
     if([subviews count] == 0)
     {
         return;
     }
        else
     {
         for (UIView *subview in subviews)
         {
             if([subview isKindOfClass:[UIActivityIndicatorView class]] && [subview respondsToSelector:@selector(startAnimating)])
                {
                     [subview performSelector:@selector(startAnimating)];
                }
         }
     }
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
    if([subviews count] == 0)
    {
        return;
    }
    else
    {
        for (UIView *subview in subviews)
        {
            if([subview isKindOfClass:[UIActivityIndicatorView class]] && [subview respondsToSelector:@selector(stopAnimating)])
            {
                [subview performSelector:@selector(stopAnimating)];
            }
        }
    }
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //iterate an array of subviews and finds indicator
    NSArray *subviews = [self.view subviews];
    if([subviews count] == 0)
    {
        return;
    }
    else
    {
        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;

}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

    return TRUE;

}
- (void) hideTabBar:(UITabBarController *) tabbarcontroller
{

    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    float fHeight = screenRect.size.height;


    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        }

    }
    [UIView commitAnimations];
}

- (void) showTabBar:(UITabBarController *) tabbarcontroller
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height - self.tabBarController.tabBar.frame.size.height;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];


    for(UIView *view in self.tabBarController.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]] )
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        }

    }
    [UIView commitAnimations];
}
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}
#pragma mark resuelve problema de que la pagina hace scroll horizontal
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [scrollView setContentOffset:CGPointMake(0, scrollView.contentOffset.y)];
}
@end

Aucun commentaire:

Enregistrer un commentaire