msumobi2. Лекция 2

96
Ещё немного Objective-С. Введение в iOS. Разработка приложений для iOS Лекция 2 Глеб Тарасов #msumobi2

Upload: -

Post on 09-May-2015

723 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: msumobi2. Лекция 2

Ещё немного Objective-С. Введение в iOS.

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

Лекция 2

Глеб Тарасов#msumobi2

Page 2: msumobi2. Лекция 2

Вспоминаем

Page 3: msumobi2. Лекция 2

Как вызвать метод startProcess без параметров у объекта в переменной «queue»?

Page 4: msumobi2. Лекция 2

Как вызвать метод startProcess без параметров у объекта в переменной «queue»?

[queue startProcess];

Page 5: msumobi2. Лекция 2

Как вызвать метод startProcessWithTimeout с

параметром 10?

Page 6: msumobi2. Лекция 2

Как вызвать метод startProcessWithTimeout с

параметром 10?

[queue startProcessWithTimeout:10];

Page 7: msumobi2. Лекция 2

Как вызвать метод startProcessWithTimeout

andSize с параметрами 10 и 100?

Page 8: msumobi2. Лекция 2

Как вызвать метод startProcessWithTimeout

andSize с параметрами 10 и 100?

[queue startProcessWithTimeout:10 andSize:100];

Page 9: msumobi2. Лекция 2

Продолжение Objective-С

Page 10: msumobi2. Лекция 2

ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;

Page 11: msumobi2. Лекция 2

ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;

Page 12: msumobi2. Лекция 2

ЧислаCGFloat a = 0.5;NSInteger b = -1;NSUInteger q = 10;

Page 13: msumobi2. Лекция 2

СтруктурыCGPoint p;p.x = 10;p.y = 20;p = CGPointMake(10, 20);

CGSize s;s.width = 100;s.height = 100;s = CGSizeMake(100, 100);

CGRect r;r.size = s;r.origin = p;r = CGRectMake(10, 20, 100, 100);

Page 14: msumobi2. Лекция 2

Стандартные классы

Page 15: msumobi2. Лекция 2

Строки

NSString NSMutableString

NSString *a = @"abc";NSString *b = [a stringByReplacingOccurrencesOfString:@"a" withString:@"b"];NSLog(@"b: %@", b);

NSMutableString *m = [b mutableCopy];NSRange r;r.length = m.length;r.location = 0;[m replaceOccurrencesOfString:@"c" withString:@"b" options:0 range:r];NSLog(@"m: %@", m);

Page 16: msumobi2. Лекция 2

Списки

NSArray NSMutableArray

NSArray *a = @[@"a", @"b", @"c"];NSString *first = a[0];NSString *last = a[[a count] - 1];

NSMutableArray *b = [a mutableCopy];[b addObject:@"r"];[b replaceObjectAtIndex:1 withObject:@"q"];[b removeObjectAtIndex:2];

Обычные упорядоченные массивы

Page 17: msumobi2. Лекция 2

Словари

NSDictionary NSMutableDictionary

NSDictionary *dict = @ { @"key1" : @"a", @"key2" : @"b" };NSString *first = dict[@"key1"];

NSMutableDictionary *m = [dict mutableCopy];m[@"key3"] = @"c";

Хранение пар «ключ-значение».Быстрый поиск значения по ключу

Page 18: msumobi2. Лекция 2

Перечисление (enumeration)

NSArray *arr = @[@"a", @"b", @"c"];

for (NSString *a in arr) { NSLog(@"%@", a);}

NSDictionary *dict = @{ @"key1" : @"a", @"key2" : @"b" };

for (NSString *key in dict){ NSString *value = dict[key]; NSLog(@"%@ - %@", key, value);}

Page 19: msumobi2. Лекция 2

ЧислаNSNumber

NSNumber *a = @(3);int b = [a intValue];

NSNumber *c = @(2.5f);float d = [c floatValue];

NSNumber *e = @(3.567);double f = [e doubleValue];

if ([a isEqualToNumber:c]) NSLog(@"equals");

Page 20: msumobi2. Лекция 2

Бинарные данные

NSData NSMutableData

NSData *data = [[NSData alloc] initWithContentsOfFile:@"data.txt"];NSInteger length = [data length];[data writeToFile:@"result.txt" atomically:YES]; NSMutableData *m = [data mutableCopy];[m appendData:data];

Хранение картинок, текстовых данных в бинарном виде и т.д.

Page 21: msumobi2. Лекция 2

NSNull

NSMutableArray *a = [[NSMutableArray alloc] init];[a addObject:[NSNull null]];

NSObject *q = [a lastObject];if (q == [NSNull null]){ //bla bla}

сохранять «пусто» в массивы и словари

Page 22: msumobi2. Лекция 2

NSValue

CGPoint p = CGPointMake(10, 20);CGRect r = CGRectMake(10, 20, 30, 40);NSValue *v1 = [NSValue valueWithCGPoint:p];NSValue *v2 = [NSValue valueWithCGRect:r];

NSArray *arr = [NSArray arrayWithObjects:v1, v2, nil];CGRect r2 = [[arr lastObject] CGRectValue];

преобразовывать структуры и другие «не объекты» в объекты

Page 23: msumobi2. Лекция 2

Dot notation

Rectangle *r = [[Rectangle alloc] init];

[r setWidth:10];

CGFloat w = [r width];

Page 24: msumobi2. Лекция 2

Dot notation

Rectangle *r = [[Rectangle alloc] init];

[r setWidth:10];

CGFloat w = [r width];

Rectangle *r = [[Rectangle alloc] init];

r.width = 10;

CGFloat w2 = r.width;

Page 25: msumobi2. Лекция 2

Dot notationКласс Rectangle

- float width (число)- float height (число)- Location location (структура)

Rectangle *r = [[Rectangle alloc] init];[r setWidth:10];[r setHeight:20];

Location l;l.x = 1;l.y = 2;

[r setLocation:l];

NSLog(@"%g, %g, (%g, %g)", [r width], [r height], [r location].x, [r location].y);

Page 26: msumobi2. Лекция 2

Dot notation

Rectangle *r = [[Rectangle alloc] init];r.width = 10;r.height = 20;Location l = {1, 2};r.location = l;

NSLog(@"%g, %g, (%g, %g)", r.width, r.height, r.location.x, r.location.y);

Page 27: msumobi2. Лекция 2

Классы

Page 28: msumobi2. Лекция 2

User.h

Page 29: msumobi2. Лекция 2

User.h@interface User

@end

Page 30: msumobi2. Лекция 2

User.h@interface User

@end

: NSObject

Page 31: msumobi2. Лекция 2

User.h@interface User

@end

#import <Foundation/Foundation.h>

: NSObject

Page 32: msumobi2. Лекция 2

User.h@interface User

@end

#import <Foundation/Foundation.h>

- (void)deleteProfile;

: NSObject

Page 33: msumobi2. Лекция 2

User.h@interface User

@end

- (void)postCommentWithText:(NSString *)text;

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;

#import <Foundation/Foundation.h>

- (void)deleteProfile;

: NSObject

Page 34: msumobi2. Лекция 2

User.h@interface User

@end

- (void)postCommentWithText:(NSString *)text;

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;

#import <Foundation/Foundation.h>

@property(nonatomic, strong) NSString *name;

@property(nonatomic) NSInteger age;

- (void)deleteProfile;

: NSObject

Page 35: msumobi2. Лекция 2

User.h@interface User

@end

- (void)postCommentWithText:(NSString *)text;

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text;

#import <Foundation/Foundation.h>

@property(nonatomic, strong) NSString *name;

@property(nonatomic) NSInteger age;

- (void)deleteProfile;

- (void)setAge:(NSInteger)age;- (NSInteger)age;

: NSObject

Page 36: msumobi2. Лекция 2

User.m

Page 37: msumobi2. Лекция 2

User.m#import "User.h"

@implementation User

@end

Page 38: msumobi2. Лекция 2

User.m#import "User.h"

@implementation User

@end

- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}

Page 39: msumobi2. Лекция 2

User.m#import "User.h"

@implementation User

@end

- (void)deleteProfile{ // удаляем из базы NSString *name = [self name]; NSLog(@"Пользователь %@ удален", name);}

- (void)postCommentWithText:(NSString *)text{ [self postCommentWithTopic:@"" andText:text];}

- (void)postCommentWithTopic:(NSString *)topic andText:(NSString *)text{ NSLog(@"Пользователь %@ (возраст: %d) с темой %@", self.name, self.age, topic);}

- (void)setAge:(NSInteger)age{ _age = age; NSLog(@"Установили возраст %d", age);}

Page 40: msumobi2. Лекция 2

Admin.h

Page 41: msumobi2. Лекция 2

Admin.h#import "User.h"

@interface Admin : User

- (void)deleteComment:(NSInteger)key;

@end

Page 42: msumobi2. Лекция 2

Admin.h#import "User.h"

@interface Admin : User

- (void)deleteComment:(NSInteger)key;

@end

Admin.m

Page 43: msumobi2. Лекция 2

Admin.h#import "User.h"

@interface Admin : User

- (void)deleteComment:(NSInteger)key;

@end

Admin.m#import "Admin.h"

@implementation Admin

- (void)deleteComment:(NSInteger)key{ //удаляем из базы NSLog(@"Комментарий с ключом %d удален", key); // оставляем комментарий, об удалении [self postCommentWithTopic:@"От админа" andText:@"Удалил коммент за хамство"];}

@end

Page 44: msumobi2. Лекция 2

Инициализация объектов

Page 45: msumobi2. Лекция 2

Инициализация объектов

User *user = [[User alloc] init];

Page 46: msumobi2. Лекция 2

Инициализация объектов

User *user = [[User alloc] init];

user.age = 34;[user setName:@"Вася Пупкин"];

Page 47: msumobi2. Лекция 2

Инициализация объектов

NSString *comment = @"Вот такой вот комментарий";

[user postCommentWithText:comment]; [user deleteProfile];

User *user2 = [[User alloc] initWithName:@"Вася Пупкин"];

User *user = [[User alloc] init];

user.age = 34;[user setName:@"Вася Пупкин"];

Page 48: msumobi2. Лекция 2

Собственный инициализатор

Page 49: msumobi2. Лекция 2

Собственный инициализатор

- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}

Page 50: msumobi2. Лекция 2

Собственный инициализатор

- (id)initWithName:(NSString *)name{ self = [super init]; if (self) { self.name = name; } return self;}

- (id)init{ return [self initWithName:@"Имя по умолчанию"];}

Page 51: msumobi2. Лекция 2

Методы класса

Page 52: msumobi2. Лекция 2

Методы классаВ файле Admin.h:

Page 53: msumobi2. Лекция 2

Методы класса

+ (Admin *)createAdmin;

В файле Admin.h:

Page 54: msumobi2. Лекция 2

Методы класса

+ (Admin *)createAdmin;

В файле Admin.h:

В файле Admin.m:

Page 55: msumobi2. Лекция 2

Методы класса

+ (Admin *)createAdmin;

+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}

В файле Admin.h:

В файле Admin.m:

Page 56: msumobi2. Лекция 2

Методы класса

+ (Admin *)createAdmin;

+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}

В файле Admin.h:

В файле Admin.m:

Использование:

Page 57: msumobi2. Лекция 2

Методы класса

+ (Admin *)createAdmin;

+ (Admin *)createAdmin{ Admin *admin = [[Admin alloc] initWithName:@"Админ Админович"]; admin.age = 34; return admin;}

В файле Admin.h:

В файле Admin.m:

Использование:

Admin *admin = [Admin createAdmin]; [admin deleteComment:10];

Page 58: msumobi2. Лекция 2

Переменные клаcса (ivar-ы)

Page 59: msumobi2. Лекция 2

Переменные клаcса (ivar-ы)@interface User : NSObject{ NSString *_name;}

- (void)setName:(NSString *)name;- (NSString *)name;

@end

Page 60: msumobi2. Лекция 2

Переменные клаcса (ivar-ы)@interface User : NSObject{ NSString *_name;}

- (void)setName:(NSString *)name;- (NSString *)name;

@end

@implementation User

- (void)setName:(NSString *)name{ _name = name; }

- (NSString *)name{ return _name;}

@end

Page 61: msumobi2. Лекция 2

Протоколы

Page 62: msumobi2. Лекция 2

Протоколы@protocol SendMessageProtocol <NSObject>

- (void)sendMessage:(NSString *)message;

@end

Page 63: msumobi2. Лекция 2

Протоколы@protocol SendMessageProtocol <NSObject>

- (void)sendMessage:(NSString *)message;

@end

@interface User : NSObject<SendMessageProtocol>

@end

Page 64: msumobi2. Лекция 2

Протоколы@protocol SendMessageProtocol <NSObject>

- (void)sendMessage:(NSString *)message;

@end

@interface User : NSObject<SendMessageProtocol>

@end

@implementation User

- (void)sendMessage:(NSString *)message{ // send message}

@end

Page 65: msumobi2. Лекция 2

Протоколы@protocol SendMessageProtocol <NSObject>

- (void)sendMessage:(NSString *)message;

@end

@interface User : NSObject<SendMessageProtocol>

@end

@implementation User

- (void)sendMessage:(NSString *)message{ // send message}

@end

id<SendMessageProtocol> sender = [[User alloc] init];[sender sendMessage:@"message"];

Page 66: msumobi2. Лекция 2

КатегорииCommentCell.m

Page 67: msumobi2. Лекция 2

Категории

@interface CommentCell()

@property (strong, nonatomic) UILabel *commentLabel;

@end

@implementation CommentCell

- (void)updateWithText:(NSString *)text{ self.commentLabel.text = text;}

@end

CommentCell.m

Page 68: msumobi2. Лекция 2

Objective-C style guide• Локальные переменные: myLocalVariable

• Свойства: myProperty

• Классы: MyClass

• Методы: doSomethingWith:

• Внутренние переменные: • _myLocal

• myLocal_

• myLocal

Page 69: msumobi2. Лекция 2

iOS

Page 70: msumobi2. Лекция 2

MVC

Controller

ModelView

Page 71: msumobi2. Лекция 2

View

Page 72: msumobi2. Лекция 2

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;

Page 73: msumobi2. Лекция 2

Иерархия UIView

Page 74: msumobi2. Лекция 2

Стандартные контролы

Page 75: msumobi2. Лекция 2

Controller

Page 76: msumobi2. Лекция 2

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);

Page 77: msumobi2. Лекция 2

@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

@interface ViewController : UIViewController

@end

Page 78: msumobi2. Лекция 2

Наполнение 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];}

Page 79: msumobi2. Лекция 2

Interface Builder(демонстрация)

Page 80: msumobi2. Лекция 2

События

Page 81: msumobi2. Лекция 2

target, action

- (void)viewDidLoad{ [super viewDidLoad];

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

- (void)buttonClicked{ NSLog(@"buttonClicked");}

Page 82: msumobi2. Лекция 2

delegate

- (void)viewDidLoad{ [super viewDidLoad]; self.tableView.delegate = self;}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"select row");}

@interface ViewController : UIViewController<UITableViewDelegate>

Page 83: msumobi2. Лекция 2

Отрывок 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;

...

Page 84: msumobi2. Лекция 2

notificationsNSNotificationCenter *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(@"Событие произошло");}

Событие случилось:

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

Page 85: msumobi2. Лекция 2

Демонстрация IBAction, delegate, IBOutlet

Page 86: msumobi2. Лекция 2

MVC

Controller

ModelView

Page 87: msumobi2. Лекция 2

MVC

Controller

ModelView

outlets

Page 88: msumobi2. Лекция 2

MVC

Controller

ModelView

outlets

Page 89: msumobi2. Лекция 2

MVC

Controller

ModelView

delegates

outlets

Page 90: msumobi2. Лекция 2

MVC

Controller

ModelView

delegates

outletstarget,action

Page 91: msumobi2. Лекция 2

MVC

Controller

ModelView

delegates

outletstarget,action

Page 92: msumobi2. Лекция 2

MVC

Controller

ModelView

delegates

outlets

notificationstarget,action

Page 93: msumobi2. Лекция 2

AppDelegate@protocol UIApplicationDelegate<NSObject>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

}

- (void)applicationDidBecomeActive:(UIApplication *)application{

}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

}

Page 94: msumobi2. Лекция 2

AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController *vc = [[UIViewController alloc] init]; self.window.rootViewController = vc; [self.window makeKeyAndVisible];}

Page 95: msumobi2. Лекция 2

Практика:Экран просмотра события

- класс Event:- title- subtitle- distance- description- image

- класс EventViewController- updateWithEvent: