Разработка приложений для iOS




             Лекция 2


MVC,View, Controllers


                               Глеб Тарасов
Приватные свойства или поля?
http://stackoverflow.com/questions/411048/differences-between-
private-fields-and-private-properties
Вспомним прошлое
     занятие
Какой метод управления памятью
    используется в языке Си?
Какой метод управления памятью
    используется в языке Си?

 Ручное выделение памяти, удаление
Какой метод управления памятью
    используется в языке Си?

 Ручное выделение памяти, удаление

        А в Objective-C?
Какой метод управления памятью
    используется в языке Си?

 Ручное выделение памяти, удаление

        А в Objective-C?

          Подсчет ссылок
Чем отличаются строки
 "string1" и @"string2"
Чем отличаются строки
 "string1" и @"string2"


Char*      NSString*
Как сохранить число 5 в массив?
Как сохранить число 5 в массив?



        NSNumber
Что такое «strong» и «weak»?

   Чем они отличаются?
Что такое «strong» и «weak»?

   Чем они отличаются?

       модификаторы у свойств,
  strong увеличивает счетчик ссылок,
               weak нет
Что значит минус
перед определением
   - (void)deleteProfile;
Что значит минус
перед определением
   - (void)deleteProfile;



Экземплярный метод
Из чего состоит
    свойство?
@property(nonatomic) NSInteger age;
Из чего состоит
      свойство?
  @property(nonatomic) NSInteger age;




getter, setter, внутренняя
        переменная
Как создать объект?
    User *user = ...
Как создать объект?
          User *user = ...




User *user = [[User alloc] init];
Какой базовый класс
для всех объектов в
    Objective-C?
Какой базовый класс
для всех объектов в
    Objective-C?

     NSObject
Как вызвать метод у
          объекта user с
       параметрами «topic»,
             «text»
- (void)postCommentWithTopic:(NSString *)topic andText:
(NSString *)text;
Как вызвать метод у
          объекта user с
       параметрами «topic»,
             «text»
- (void)postCommentWithTopic:(NSString *)topic andText:
(NSString *)text;




[user postCommentWithTopic:@"topic"
andText:@"text"];
MVC
       Controller




View                Model
View
UIView
@property(nonatomic) CGRect frame;
@property(nonatomic) CGRect bounds;
@property(nonatomic) CGPoint center;

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

-   (void)removeFromSuperview;
-   (void)addSubview:(UIView *)view;
-   (void)bringSubviewToFront:(UIView *)view;
-   (void)sendSubviewToBack:(UIView *)view;

@property(nonatomic,copy) UIColor *backgroundColor;
@property(nonatomic) CGFloat alpha;
@property(nonatomic,getter=isHidden) BOOL hidden;
Иерархия UIView
Стандартные
 контролы
Controller
UIViewController
// The getter first invokes [self loadView] if the view hasn't been set yet.
// Subclasses must call super if they override the setter or getter.
@property(nonatomic,retain) UIView *view;

// This is where subclasses should create their custom view hierarchy
// if they aren't using a nib.
// Should never be called directly.
- (void)loadView;


- (void)viewWillUnload __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
// Called after the view has been loaded. For view controllers created in
code,
// this is after -loadView. For view controllers unarchived from a nib,
// this is after the view is set.
- (void)viewDidLoad;

// Called after the view controller's view is released and set to nil.
// For example, a memory warning which causes the view to be purged.
// Not invoked as a result of -dealloc.
- (void)viewDidUnload __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

- (BOOL)isViewLoaded __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
@interface ViewController : UIViewController

@end


@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    CGRect rect = CGRectMake(20, 20, 100, 100);
    UILabel *l = [[UILabel alloc] initWithFrame:rect];
    l.text = @"text";
    [self.view addSubview:l];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"появился");
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    NSLog(@"пропал");
}

@end
Наполнение View


     В коде                                  Interface Builder

- (void)viewDidLoad
{
    [super viewDidLoad];
    CGRect rect = CGRectMake(20, 20, 100, 100);
    UILabel *l = [[UILabel alloc] initWithFrame:rect];
    l.text = @"text";
    [self.view addSubview:l];
}
Interface Builder
  (демонстрация)
События
target, action

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.button addTarget:self
                    action:@selector(buttonClicked)
          forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonClicked
{
    NSLog(@"buttonClicked");
}
delegate
@interface ViewController : UIViewController<UITableViewDelegate>



- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.delegate = self;
}

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"select row");
}
Отрывок
        UIScrollViewDelegate
@protocol UIScrollViewDelegate<NSObject>

@optional

// any offset changes
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

// any zoom scale changes
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);

// called on start of dragging
// (may require some time and or distance to move)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

...
notifications
Событие случилось:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"UserChanged" object:nil];


Ловим событие:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(userChanged)
               name:@"UserChanged"
             object:nil];

- (void)userChanged
{
    NSLog(@"Событие произошло");
}
MVC
       Controller




View                Model
MVC
       Controller



        outlets


View                Model
MVC
       Controller



        outlets


View                Model
MVC
              Controller
  delegates

               outlets


View                       Model
MVC
                  Controller
      delegates
target,action
                   outlets


  View                         Model
MVC
                  Controller
      delegates
target,action
                   outlets


  View                         Model
MVC
                  Controller
      delegates
target,action                  notifications
                   outlets


  View                            Model
Демонстрация
Что мы сегодня узнали?
Какой класс базовый
      для всех
   интерфейсных
    элементов?
Какой класс базовый
      для всех
   интерфейсных
    элементов?

      UIView
Какой класс базовый
      для всех
   контроллеров?
Какой класс базовый
      для всех
   контроллеров?
  UIViewController
Как контроллер получает
ссылку на view в Interface
        Builder?
Как контроллер получает
ссылку на view в Interface
        Builder?



     через IBOutlet
Как контроллер узнает
   об изменениях в
       модели?
Как контроллер узнает
   об изменениях в
       модели?


  через notification-ы
Как view сообщает
  контроллеру о
    действиях
  пользователя?
Как view сообщает
      контроллеру о
        действиях
      пользователя?

через target/action и delegate
Темы для подготовки
       Написать
     приложение-
    демонстрацию

  UIWebView
 (например, простой
       браузер:
   адресная строка,
кнопки назад/вперед)
Темы для подготовки
Написать приложение-демонстрацию

        UIScrollView
    (например,
     прокрутка
    нескольких
     картинок
  с пагинацией и
        без)
Темы для подготовки
      Написать
    приложение-
   демонстрацию

MKMapView
  (например, карта с
указанием на ваш дом)
Темы для подготовки
    Написать
  приложение-
 демонстрацию
UITableView
 (например, вывести
   список строк из
  файла в таблицу)
Спасибо

     Глеб Тарасов
     gleb34@gmail.com
     twitter.com/pilot34

Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers