82
What I’ve learned when developing BlockAlertViews Gustavo Ambrozio 360iDev 2012 Tuesday, September 11, 12

What I’ve learned when developing BlockAlertViews

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 2: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

Tuesday, September 11, 12

Page 3: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

• For iOS since the official SDK came out

Tuesday, September 11, 12

Page 4: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

• For iOS since the official SDK came out

• Did some apps and contracts as an independent developer in Brazil

Tuesday, September 11, 12

Page 5: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

• For iOS since the official SDK came out

• Did some apps and contracts as an independent developer in Brazil

• Writter for raywenderlich.com

Tuesday, September 11, 12

Page 6: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

• For iOS since the official SDK came out

• Did some apps and contracts as an independent developer in Brazil

• Writter for raywenderlich.com

• Hired by PocketGems to code games in SF

Tuesday, September 11, 12

Page 7: What I’ve learned when developing BlockAlertViews

About me• Developing professionally since age of 15

• For iOS since the official SDK came out

• Did some apps and contracts as an independent developer in Brazil

• Writter for raywenderlich.com

• Hired by PocketGems to code games in SF

• Hate engligh prepositions

Tuesday, September 11, 12

Page 8: What I’ve learned when developing BlockAlertViews

What’s BlockAlertView

Tuesday, September 11, 12

Page 9: What I’ve learned when developing BlockAlertViews

What’s BlockAlertView

Tuesday, September 11, 12

Page 10: What I’ve learned when developing BlockAlertViews

What’s BlockAlertView

Tuesday, September 11, 12

Page 11: What I’ve learned when developing BlockAlertViews

My love and hate story with UIAlertView

• (apparently) Easy to use • Delegates

• Switches

• Tags

• Constants

Tuesday, September 11, 12

Page 12: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ UIAlertView *view = [[UIAlertView alloc] initWithTitle:@”Send to” message:@”Send message using:” delegate:self cancelButtonTitle:@”Cancel” otherButtonTitles:@”Twitter”, @”Facebook”, @”Email”, nil]; view.tag = kSendAlertView; [view show]; [view release];}

Tuesday, September 11, 12

Page 13: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ UIAlertView *view = [[UIAlertView alloc] initWithTitle:@”Send to” message:@”Send message using:” delegate:self cancelButtonTitle:@”Cancel” otherButtonTitles:@”Twitter”, @”Facebook”, @”Email”, nil]; view.tag = kSendAlertView; [view show]; [view release];}

Tuesday, September 11, 12

Page 14: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ UIAlertView *view = [[UIAlertView alloc] initWithTitle:@”Send to” message:@”Send message using:” delegate:self cancelButtonTitle:@”Cancel” otherButtonTitles:@”Twitter”, @”Facebook”, @”Email”, nil]; view.tag = kSendAlertView; [view show]; [view release];}

Tuesday, September 11, 12

Page 15: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ UIAlertView *view = [[UIAlertView alloc] initWithTitle:@”Send to” message:@”Send message using:” delegate:self cancelButtonTitle:@”Cancel” otherButtonTitles:@”Twitter”, @”Facebook”, @”Email”, nil]; view.tag = kSendAlertView; [view show]; [view release];}

Tuesday, September 11, 12

Page 16: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 17: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 18: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 19: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 20: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 21: What I’ve learned when developing BlockAlertViews

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

switch (alertView.tag){

case kRemoveConfirmAlertView:if (buttonIndex == 1)

[self removeItem];break;

case kSendAlertView:{

switch (buttonIndex){

case 0: // Cancelbreak;

case 1: // Twitter[self sendWith:kTwitter];break;

case 2: // Facebook[self sendWith:kFacebook];break;

case 3: // emailMFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];break;

}}break;

}}

Tuesday, September 11, 12

Page 25: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlocAlertView alertWithTitle:@”Send to” message:@”Send message using:”]; [view setCancelButtonWithTitle:@”Cancel” block:nil]; [view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }]; [view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }]; [view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}]; view .tag = kSendAlertView; [view show];}

Tuesday, September 11, 12

Page 26: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlocAlertView alertWithTitle:@”Send to” message:@”Send message using:”]; [view setCancelButtonWithTitle:@”Cancel” block:nil]; [view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }]; [view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }]; [view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}]; view .tag = kSendAlertView; [view show];}

Tuesday, September 11, 12

Page 27: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlocAlertView alertWithTitle:@”Send to” message:@”Send message using:”]; [view setCancelButtonWithTitle:@”Cancel” block:nil]; [view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }]; [view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }]; [view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}]; view .tag = kSendAlertView; [view show];}

Tuesday, September 11, 12

Page 28: What I’ve learned when developing BlockAlertViews

@interface MyViewController : UIViewController <UIAlertViewDelegate>

#define kRemoveConfirmAlertView 1#define kSendAlertView 2#define kLogoutConfirmAlertView 3

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlocAlertView alertWithTitle:@”Send to” message:@”Send message using:”]; [view setCancelButtonWithTitle:@”Cancel” block:nil]; [view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }]; [view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }]; [view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}]; view .tag = kSendAlertView; [view show];}

Tuesday, September 11, 12

Page 29: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}];

[view show];}

Tuesday, September 11, 12

Page 30: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view addButtonWithTitle:@”Email”, block:^{ MFMailComposeViewController *view = [[MFMailComposeViewController alloc] init];

view.mailComposeDelegate = self;[self.navigationController presentModalViewController:view animated:YES];

}];

[view show];}

Tuesday, September 11, 12

Page 31: What I’ve learned when developing BlockAlertViews

Lesson number 1

1. Use blocks instead of delegates (almost) all the time

Tuesday, September 11, 12

Page 32: What I’ve learned when developing BlockAlertViews

Lesson number 1

1. Use blocks instead of delegates (almost) all the time

• Exception: When the block can retain something that can be deallocated before que block call gets made (NSURLConnections for example)

Tuesday, September 11, 12

Page 33: What I’ve learned when developing BlockAlertViews

How to do it

1. Subclass the original class and have it conform with it’s delegate.

2. Create typedefs for all blocks

3. Create @property for all blocks with (copy)

4. Implement all init methods and set self as delegate.

5. Implement all delegates, create ivars for all and call them if not nil.

Tuesday, September 11, 12

Page 34: What I’ve learned when developing BlockAlertViews

ARC compatibility

• Simple:

#if ! __has_feature(objc_arc)

#error This file must be compiled with ARC. Please add -fobjc-arc to the compiler flags of this file.

#endif

• Better:

Use Nick Lockwood’s ARC Helper .h file:

https://gist.github.com/1563325

Tuesday, September 11, 12

Page 35: What I’ve learned when developing BlockAlertViews

Improving AVAudioPlayer

#import <Foundation/Foundation.h>#import <AVFoundation/AVFoundation.h>#import "ARCHelper.h"

typedef void (^AudioPlayerDidFinishPlayingBlock)(BOOL);typedef void (^AudioPlayerDecodeErrorDidOccurBlock)(NSError *);typedef void (^AudioPlayerBeginInterruptionBlock)();typedef void (^AudioPlayerEndInterruptionBlock)(NSUInteger);

@interface BlockAudioPlayer : AVAudioPlayer <AVAudioPlayerDelegate>

@property (nonatomic, copy) AudioPlayerDidFinishPlayingBlock audioPlayerDidFinishPlayingBlock;@property (nonatomic, copy) AudioPlayerDecodeErrorDidOccurBlock audioPlayerDecodeErrorDidOccurBlock;@property (nonatomic, copy) AudioPlayerBeginInterruptionBlock audioPlayerBeginInterruptionBlock;@property (nonatomic, copy) AudioPlayerEndInterruptionBlock audioPlayerEndInterruptionBlock;

@end

Tuesday, September 11, 12

Page 36: What I’ve learned when developing BlockAlertViews

Improving AVAudioPlayer- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError{ self = [super initWithContentsOfURL:url error:outError]; if (self) { self.delegate = self; } return self;}

#pragma mark - AVAudioPlayerDelegate

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ if (audioPlayerDidFinishPlayingBlock) audioPlayerDidFinishPlayingBlock(flag);}

https://github.com/gpambrozio/BlockAudioPlayer

Zachary Waldowski’s https://github.com/zwaldowski/BlocksKit

Tuesday, September 11, 12

Page 37: What I’ve learned when developing BlockAlertViews

Hate comes back with a new face

Tuesday, September 11, 12

Page 38: What I’ve learned when developing BlockAlertViews

Hate comes back with a new face

Tuesday, September 11, 12

Page 39: What I’ve learned when developing BlockAlertViews

Hate comes back with a new face

Tuesday, September 11, 12

Page 40: What I’ve learned when developing BlockAlertViews

A vision on how to end this hatred

Tuesday, September 11, 12

Page 41: What I’ve learned when developing BlockAlertViews

A vision on how to end this hatred

Tuesday, September 11, 12

Page 42: What I’ve learned when developing BlockAlertViews

A vision on how to end this hatred

Tuesday, September 11, 12

Page 43: What I’ve learned when developing BlockAlertViews

A vision on how to end this hatred

Tuesday, September 11, 12

Page 44: What I’ve learned when developing BlockAlertViews

Striking hatred with code

Tuesday, September 11, 12

Page 45: What I’ve learned when developing BlockAlertViews

Striking hatred with code

Tuesday, September 11, 12

Page 46: What I’ve learned when developing BlockAlertViews

Striking hatred with code

UIWindow

UView

UILabel

UIButton

Tuesday, September 11, 12

Page 47: What I’ve learned when developing BlockAlertViews

Striking hatred with code

UIWindow

UView

UILabel

UIButton

Tuesday, September 11, 12

Page 48: What I’ve learned when developing BlockAlertViews

Striking hatred with code

UIWindow

UView

UILabel

UIButton

Tuesday, September 11, 12

Page 49: What I’ve learned when developing BlockAlertViews

Lesson number 2

2. UIWindow is an unkown obscure class that’s very rarely used (and with very poor documentation) but that might solve some tricky UI problems. Use with care.

Tuesday, September 11, 12

Page 50: What I’ve learned when developing BlockAlertViews

UIWindow basics

• No hierarchy. UIWindow are ordered using their windowLevel:• UIWindowLevelNormal• UIWIndowLevelAlert• UIWindowLevelStatusBar

• If on the same level, ordered by creation time, last on top.

• makeKeyAndVisible can push it to the top, but still respecting windowLevel.

Tuesday, September 11, 12

Page 51: What I’ve learned when developing BlockAlertViews

Key Window

• From the docs: “...window which is currently receiving keyboard events and other non touch-related events. Whereas touch events are delivered to the window in which the touch occurred, events that do not have an associated coordinate value are delivered to the key window of your application. Only one window at a time may be key."

• When you create a UIWindow and call makeKeyWindow, don’t just call resignKeyWindow. Save the previous keyWindow and call makeKeyWindow on it when you’re done.

Tuesday, September 11, 12

Page 52: What I’ve learned when developing BlockAlertViews

Destroying hate

Tuesday, September 11, 12

Page 53: What I’ve learned when developing BlockAlertViews

Lessons number 3 and 4

3. Open your mind to other libraries and don’t assume you need to do it the Apple way

Tuesday, September 11, 12

Page 54: What I’ve learned when developing BlockAlertViews

Lessons number 3 and 4

3. Open your mind to other libraries and don’t assume you need to do it the Apple way

4. Don’t be lazy. It’s fun to implement something from scratch.

Tuesday, September 11, 12

Page 55: What I’ve learned when developing BlockAlertViews

Spreading the love• BlockAlertView and BlockActionSheets are

open source

• github.com/gpambrozio/BlockAlertsAnd-ActionSheets

Tuesday, September 11, 12

Page 56: What I’ve learned when developing BlockAlertViews

Spreading the love• BlockAlertView and BlockActionSheets are

open source

• github.com/gpambrozio/BlockAlertsAnd-ActionSheets

• blog.codecropper.com/2012/01/replicating-tweetbot-alerts-and-action-sheets/

Tuesday, September 11, 12

Page 57: What I’ve learned when developing BlockAlertViews

Spreading the love• BlockAlertView and BlockActionSheets are

open source

• github.com/gpambrozio/BlockAlertsAnd-ActionSheets

• blog.codecropper.com/2012/01/replicating-tweetbot-alerts-and-action-sheets/

• Improvements to UIAlertView and UIActionSheet

Tuesday, September 11, 12

Page 58: What I’ve learned when developing BlockAlertViews

Spreading the love

• Import 6 files, 3 .h and 3 .m

Tuesday, September 11, 12

Page 59: What I’ve learned when developing BlockAlertViews

Spreading the love

• Import 6 files, 3 .h and 3 .m

• Copy 1 .h file with UI attributes

Tuesday, September 11, 12

Page 60: What I’ve learned when developing BlockAlertViews

Spreading the love

• Import 6 files, 3 .h and 3 .m

• Copy 1 .h file with UI attributes

• Copy PNG assets or create your own

Tuesday, September 11, 12

Page 61: What I’ve learned when developing BlockAlertViews

Spreading the love

• Import 6 files, 3 .h and 3 .m

• Copy 1 .h file with UI attributes

• Copy PNG assets or create your own

• Change UI (optional)

Tuesday, September 11, 12

Page 62: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 63: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 64: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 65: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 66: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 67: What I’ve learned when developing BlockAlertViews

- (IBAction)sendItem:(id)sender{ BlockAlertView *view = [BlockAlertView alertWithTitle:@”Send to” message:@”Send message using:”];

[view setCancelButtonWithTitle:@”Cancel” block:nil];

[view addButtonWithTitle:@”Twitter”, block:^{ [self sendWith:kTwitter]; }];

[view addButtonWithTitle:@”Facebook”, block:^{ [self sendWith:kFacebook]; }];

[view setDestructiveButtonWithTitle:@”Delete”, block:^{ [self removeItem]; }];

[view show];}

Tuesday, September 11, 12

Page 68: What I’ve learned when developing BlockAlertViews

Spreading the love

Tuesday, September 11, 12

Page 69: What I’ve learned when developing BlockAlertViews

Spreading the love

Tuesday, September 11, 12

Page 70: What I’ve learned when developing BlockAlertViews

Advanced love• Background and buttons and simple PNGs

Tuesday, September 11, 12

Page 71: What I’ve learned when developing BlockAlertViews

Advanced love• It’s only an UIView....

[BlockBackgroundsharedInstance]

UIView

Tuesday, September 11, 12

Page 72: What I’ve learned when developing BlockAlertViews

Advanced love• BlockTextPromptAlertView

Tuesday, September 11, 12

Page 73: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 74: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 75: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 76: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 77: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 78: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 79: What I’ve learned when developing BlockAlertViews

Animated love

Tuesday, September 11, 12

Page 80: What I’ve learned when developing BlockAlertViews

Lesson number 5

5. Opening your source is good: Improves your karma, your reputation and your source code.

Tuesday, September 11, 12

Page 81: What I’ve learned when developing BlockAlertViews

Gustavo Ambrozio

• @gpambrozio

• blog.codecropper.com

• github.com/gpambrozio

• linkedin.com/in/gustavoambrozio

Tuesday, September 11, 12

Page 82: What I’ve learned when developing BlockAlertViews

We’re hiring

2 apps in top 25 grossing apps

Tuesday, September 11, 12