What I’ve learned when developing BlockAlertViews
-
Upload
gustavo-ambrozio -
Category
Technology
-
view
702 -
download
3
description
Transcript of What I’ve learned when developing BlockAlertViews
![Page 1: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/1.jpg)
What I’ve learned when developing
BlockAlertViews
Gustavo Ambrozio360iDev 2012
Tuesday, September 11, 12
![Page 2: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/2.jpg)
About me• Developing professionally since age of 15
Tuesday, September 11, 12
![Page 3: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/3.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/4.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/5.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/6.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/7.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/8.jpg)
What’s BlockAlertView
Tuesday, September 11, 12
![Page 9: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/9.jpg)
What’s BlockAlertView
Tuesday, September 11, 12
![Page 10: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/10.jpg)
What’s BlockAlertView
Tuesday, September 11, 12
![Page 11: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/11.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/12.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/13.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/14.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/15.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/16.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/17.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/18.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/19.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/20.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/21.jpg)
- (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 22: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/22.jpg)
How blocks ended my hatred
• PSFoundation (https://github.com/steipete/PSFoundation/tree/master/Utils)
• Peter Steinberger
Tuesday, September 11, 12
![Page 23: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/23.jpg)
How blocks ended my hatred
• PSFoundation (https://github.com/steipete/PSFoundation/tree/master/Utils)
• Peter Steinberger
• PSAlertView e PSActionSheet
Tuesday, September 11, 12
![Page 24: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/24.jpg)
How blocks ended my hatred
• PSFoundation (https://github.com/steipete/PSFoundation/tree/master/Utils)
• Peter Steinberger
• PSAlertView e PSActionSheet
• Renamed to BlockAlertView and BlockActionSheet
Tuesday, September 11, 12
![Page 25: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/25.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/26.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/27.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/28.jpg)
@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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/29.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/30.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/31.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/32.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/33.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/34.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/35.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/36.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/37.jpg)
Hate comes back with a new face
Tuesday, September 11, 12
![Page 38: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/38.jpg)
Hate comes back with a new face
Tuesday, September 11, 12
![Page 39: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/39.jpg)
Hate comes back with a new face
Tuesday, September 11, 12
![Page 40: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/40.jpg)
A vision on how to end this hatred
Tuesday, September 11, 12
![Page 41: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/41.jpg)
A vision on how to end this hatred
Tuesday, September 11, 12
![Page 42: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/42.jpg)
A vision on how to end this hatred
Tuesday, September 11, 12
![Page 43: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/43.jpg)
A vision on how to end this hatred
Tuesday, September 11, 12
![Page 44: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/44.jpg)
Striking hatred with code
Tuesday, September 11, 12
![Page 45: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/45.jpg)
Striking hatred with code
Tuesday, September 11, 12
![Page 46: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/46.jpg)
Striking hatred with code
UIWindow
UView
UILabel
UIButton
Tuesday, September 11, 12
![Page 47: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/47.jpg)
Striking hatred with code
UIWindow
UView
UILabel
UIButton
Tuesday, September 11, 12
![Page 48: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/48.jpg)
Striking hatred with code
UIWindow
UView
UILabel
UIButton
Tuesday, September 11, 12
![Page 49: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/49.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/50.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/51.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/52.jpg)
Destroying hate
Tuesday, September 11, 12
![Page 53: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/53.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/54.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/55.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/56.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/57.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/58.jpg)
Spreading the love
• Import 6 files, 3 .h and 3 .m
Tuesday, September 11, 12
![Page 59: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/59.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/60.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/61.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/62.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/63.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/64.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/65.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/66.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/67.jpg)
- (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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/68.jpg)
Spreading the love
Tuesday, September 11, 12
![Page 69: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/69.jpg)
Spreading the love
Tuesday, September 11, 12
![Page 70: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/70.jpg)
Advanced love• Background and buttons and simple PNGs
Tuesday, September 11, 12
![Page 71: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/71.jpg)
Advanced love• It’s only an UIView....
[BlockBackgroundsharedInstance]
UIView
Tuesday, September 11, 12
![Page 72: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/72.jpg)
Advanced love• BlockTextPromptAlertView
Tuesday, September 11, 12
![Page 73: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/73.jpg)
Animated love
Tuesday, September 11, 12
![Page 74: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/74.jpg)
Animated love
Tuesday, September 11, 12
![Page 75: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/75.jpg)
Animated love
Tuesday, September 11, 12
![Page 76: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/76.jpg)
Animated love
Tuesday, September 11, 12
![Page 77: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/77.jpg)
Animated love
Tuesday, September 11, 12
![Page 78: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/78.jpg)
Animated love
Tuesday, September 11, 12
![Page 79: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/79.jpg)
Animated love
Tuesday, September 11, 12
![Page 80: What I’ve learned when developing BlockAlertViews](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/80.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/81.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051818/54bd44044a79594a148b4612/html5/thumbnails/82.jpg)
We’re hiring
2 apps in top 25 grossing apps
Tuesday, September 11, 12