понеділок, 14 травня 2012 р.

Objective-C(junior level) @"Delegate and custom Button"

Привіт відвідувачам мого блогу. Давно не бачились, (якщо ми взагалі хоч раз в житті будь-де з Вами пересікались). В мене, вже закінчився зошит в якому я занотовува цікавинки з життя Objective-C, тому я вирішив по-перше завести новий зошит, а по-друге надати інформацію отриману за десь пів-року моєї праці перенісши в цифровий вигляд сторінки з зошиту. Хочу наперд сказати нічого наднового Ви не побачите тут, все це можна вигребти з бездни інтернету потративши тьму часу, правда мені здаєтся, що краще просто зайти до мене швиденько в блог і знайти необхідну інфу.
Отож, хотів би  розпочати з того, що колупало мій мозок перший час поки я знайомився з мовою Objective-С, а саме delegate та штука довго не проверталась в мене в голові, а конкретно всі етапи її створення та взагалі просто його смисл. Забігаючи наперед маю сказати, що на даному етапі мого розвитку без делегатів в мене не проходить жоден робочий день. Бо як виявилось то штука цікава і корисна.
Для прикладу пропоную реалізувати таку річ:
В нас є контроллер на ньому є якась в'юшка, проста UIView в середину ми додаємо княпавку при натисненні на яку в нас змінюється фон у нашого контроллера НЕ в'юшки! 
Я впевнений на всі 100 %, що гуру Objective-C вже закрили даний блог і додали собі в чорний список, бо як можна наводити такі прості приклади, краще б я там навів прикладом парс  JSON(а), який качає чаcтинами, з гіговий файл і зберігаючи в NSDocumentDirectory і маркує спеціальним чином щоб його не реджектнули і він не синхронизувався з iCloud. Як варіант можна ще почути:@"Нашо тут делегат два суперв'ю" і ти в контроллері. Ніхто не сперечається, що і так можна просто ми тут люди маленькі займаємось простими речами.
Доречі маю сказати, що я як і багато з піонерів, які пробували писать для Objective-С не під маком (в даному контексті немає жодного натяку на наркотичні речовини), був змушений змиритись, що  не треба експерементувати, та мучати мозок собі і людям. 

Тому,
1 - Вам треба MacBook || MacBook pro || Mac Air || iMac || Mac mini. 
2 - Xcode.
3 - Базові навички в створенні проекту.

//SimpleView.h
#import <UIKit/UIKit.h>

/*Протокол, метеоди якого необхідно буде реалізувати в контролерах, які будуть використовувати нашу в'юшку */

@protocol SimpleViewDelegate
-(void)changeBackGroundAtController;
@end

@interface SimpleView : UIView
// Екземпляр делегату, який служить для зв'язку.
@property(nonatomic, assign) id<SimpleViewDelegate> delegate;
//Метод який служить для створення нашої в'ю.
- (id)initWithFrame:(CGRect)frame andDelegate:(id<SimpleViewDelegate>) theDelegate;
@end
//SimpleView.m
#import "SimpleView.h"



@interface SimpleView()

//Кажемо, що в нас буде властивість кнопка

@property (nonatomic, retain) UIButton * changeBackgroundButton;

//Метод для додавання до в'ю  кнопки

-(void) addingButton;
@end

//Розміри кнопки
CGFloat buttonWidth  = 140.0;
CGFloat buttonHeight = 44.0;

@implementation SimpleView
//сетери - гетери
@synthesize delegate = _delegate, changeBackgroundButton = _changeBackgroundButton;

- (id)initWithFrame:(CGRect)frame andDelegate:(id<SimpleViewDelegate>) theDelegate
{
    self = [super initWithFrame:frame];
    if (self) {
      self.delegate = theDelegate;
      [self addingButton];
    }
  
    return self;
}

-(void) addingButton
//Знаходимо координати, де ми маємо розмістити кнопку 
  CGFloat x = (self.frame.size.width  - buttonWidth) /2.0;
  CGFloat y = (self.frame.size.height - buttonHeight)/2.0;
//Ініціалізуємо кнопку
  UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(x, y, buttonWidth, buttonHeight)];
  self.changeBackgroundButton = button;
  [button release];
//Вказуємо, що : реалізацію методу треба шукать в цьому класі (self) назва методу 
clicked при натисненні та іпіднятті вверх над цією кнопкою  UIControlEventTouchUpInside
  [_changeBackgroundButton addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];
  [_changeBackgroundButton setBackgroundColor:[UIColor yellowColor]];
  [_changeBackgroundButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [_changeBackgroundButton setTitle:@"Just click it!" forState:UIControlStateNormal];
//Додаємо до нашої в'ю кнопку
  [self addSubview:_changeBackgroundButton];
}
//Реакція на натиснення
-(void)clicked:(UIButton *) button

{

//Зв'язуємося з контроллером через делегата

  [_delegate changeBackGroundAtController];

}

//Зільнюємо пам'ять

-(void) dealloc
{
  self.changeBackgroundButton = nil;
  [super dealloc];
}
@end


//SimpleViewController.h
#import <UIKit/UIKit.h>

@interface SimpleViewController : UIViewController

@end


//SimpleViewController.m
#import "SimpleViewController.h"
#import "SimpleView.h"
@interface SimpleViewController ()<SimpleViewDelegate>
//Проперті нашої нещодавно створенної в'ю
@property(nonatomic, retain)SimpleView * viewWithButton;
@end

@implementation SimpleViewController
@synthesize viewWithButton = _viewWithButton;
- (void)viewDidLoad
{
    [super viewDidLoad];
//Ініціалізуємо і створюємо нашу просту в'ю 
  SimpleView * sView = [[SimpleView alloc] initWithFrame:CGRectMake(0, 0,    self.view.frame.size.width, self.view.frame.size.height / 2) andDelegate:self];
  self.viewWithButton = sView;
  [sView setBackgroundColor:[UIColor blueColor]];
  [sView release];
//Додаємо в'ю до контролера
  [self.view addSubview:_viewWithButton];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
//Звільнюємо пам'ять
    self.viewWithButton = nil;
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Встановлюємо що наш додаток працює тільки в портреній орієнтації
  return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark-
#pragma mark SimpleViewDelegate Methods
//Ловимо відповід про натиснення через делегата
-(void)changeBackGroundAtController
{
//Змінюємо бекграунд(нижню частину екрану) на довільно задану
  CGFloat r = random()% 255 / 255.0;
  CGFloat g = random()% 255 / 255.0;
  CGFloat b = random()% 255 / 255.0;
  UIColor * myColor = [UIColor colorWithRed:r green:g blue:b alpha:1];
  [self.view setBackgroundColor:myColor];
}
@end


Немає коментарів:

Дописати коментар