Smalltalk 에서 처음 소개되었던 Model View Controller(이하 MVC)패턴은 Cocoa frameworks의 전반적인 기반으로 사용된다. 모든 Object를 세가지 종류 중 하나로 분리하는 작업이 필요하다.
Model : Model은 어플리케이션의 단일한 능력이나 정보를 제공하는 객체이다. View나 Controller와 의존성이 없어야 한다.
View : View는 Model과 합쳐진 정보를 나타내거나, 사용자와 상호작용을 하는데 사용된다. View는 웹기반이 될 수도, Command line기반이 될 수도, GUI가 될 수도 있다. 이러한 다양한 View는 같은 Model과 작용할 수 있어야 한다.
Controller : Controller의 목적은 Model과 View의 기능을 분리 시키는 데에 있다. View에서 사용자와의 상호작용의 결과를 이용해, Model의 정보를 변화시킨다.
MVC의 기본적인 목적은 Model과 View, Controller의 기능을 분리시켜 각각의 변화가 생겨도 서로 간의 영향을 주지 않도록 하는데에 있다.
MVC in Cocoa
Model은 Core Data가, View와 Controller는 Application Kit이 제공한다. Foundation framework은 위의 3 subsystems에서 사용되는 class를 제공한다. Model은 Cocoa framework외에 다른 subsystems에서도 사용될 수 있도록 구현되기도 한다. 하지만 Core Data frameworks는 강력하고 유연한 기능을 제공하므로, Cross-platform이 필요하지 않다면 Cocoa 기술을 이용해서 Model을 설계하는것이 유리하다.
Core Data / Model
Model은 영구정보저장과, Object relationship management의 문제를 해결해야한다. Binary file 혹은 사람이 읽을 수 있는 Text file 등 여러 방법으로 저장할 수 있다. Core Data는 XML, binary flat files, SQLite database 3가지의 file format을 가지고 있다.
Core Data는 3가지의 file format을 개발과정에서 자유롭게 바꾸거나 3가지 모두 동시에 지원가능하도록 해준다.
대부분의 Model은 여러 objects간의 관계를 관리해준다. Core Data는 one to one, one to many 관계를 지원한다. 각 관계는 옵션이거나 필수일 수 있다. Core Data는 relationships, constraints, default values 를 개발자가 정의할 수 있도록 제공하고, relationship을 validate해준다.
Apple의 Xcode tool의 Graphical object modeler를 이용하면, graphical하게 Model object를 정의할 수 있다.
Application Kit / View
모든 Cocoa application은 OS와 연결을 유지하기 위해서 NSApplication의 Instance를 사용한다. NSApplication, NSView, NSWindow는 모두 NSResponder의 Subclasses다. NSResponder는 Responder Chain design pattern을 구현한다.
NSView는 Hierarchies pattern을 구현한다. 모든 NSView는 Subviews를 가질 수 있다.
Cocoa의 대부분의 UI Components는 NSControl의 Subclasses이다. NSControl은 Targets and Actions와 Responder Chain patterns의 중요한 역할을 한다.
NSCell은 Flyweight pattern을 구현한다. Flyweight는 수행시간과 Memory소비를 최적화한다. NSControl의 Instances는 최적화와 유연성을 더하기 위해서 NSCell의 Subclasses를 사용한다.
Application Kit / Controller
2010년 9월 30일 목요일
2010년 9월 19일 일요일
(한글) 앱스토어 리뷰가이드 라인
|
2010년 9월 14일 화요일
두 대 이상의 컴퓨터에서 개발하고자 하는 경우..
Provisioning Profile을 가져가지 않으면 개발 할 수가 없습니다..
Xcode를 실행, Window > Organizer 에서
왼쪽의 IOS DEVELOPMENT > Developer Profile에서
Provisioning Profile을 Export 한 후에 새로운 컴퓨터에서 Import하면 됩니다
Xcode를 실행, Window > Organizer 에서
왼쪽의 IOS DEVELOPMENT > Developer Profile에서
Provisioning Profile을 Export 한 후에 새로운 컴퓨터에서 Import하면 됩니다
2010년 9월 12일 일요일
ViewTransitions 펌
/*
File: ViewTransitionsAppDelegate.m
Abstract: The UIApplication delegate class, the central controller of the application.
Version: 1.9
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
Inc. ("Apple") in consideration of your agreement to the following
terms, and your use, installation, modification or redistribution of
this Apple software constitutes acceptance of these terms. If you do
not agree with these terms, please do not use, install, modify or
redistribute this Apple software.
In consideration of your agreement to abide by the following terms, and
subject to these terms, Apple grants you a personal, non-exclusive
license, under Apple's copyrights in this original Apple software (the
"Apple Software"), to use, reproduce, modify and redistribute the Apple
Software, with or without modifications, in source and/or binary forms;
provided that if you redistribute the Apple Software in its entirety and
without modifications, you must retain this notice and the following
text and disclaimers in all such redistributions of the Apple Software.
Neither the name, trademarks, service marks or logos of Apple Inc. may
be used to endorse or promote products derived from the Apple Software
without specific prior written permission from Apple. Except as
expressly stated in this notice, no other rights or licenses, express or
implied, are granted by Apple herein, including but not limited to any
patent rights that may be infringed by your derivative works or by other
works in which the Apple Software may be incorporated.
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Copyright (C) 2010 Apple Inc. All Rights Reserved.
*/
#import
@interface ViewTransitionsAppDelegate : NSObject
{
UIView *containerView;
UIImageView *view1;
UIImageView *view2;
BOOL transitioning;
}
@property (nonatomic, retain) IBOutlet UIView *containerView;
-(IBAction)nextTransition:(id)sender;
@end
#import "ViewTransitionsAppDelegate.h"
#import
@implementation ViewTransitionsAppDelegate
@synthesize containerView;
-(void)applicationDidFinishLaunching:(UIApplication *)application
{
// Create the two views to transition between, and add them to our containerView. We'll hide the second one
// until we are ready to transition to it.
UIImage *image1 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1.jpg" ofType:nil]];
view1 = [[UIImageView alloc] initWithImage:image1];
UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image2.jpg" ofType:nil]];
view2 = [[UIImageView alloc] initWithImage:image2];
view2.hidden = YES;
[containerView addSubview:view1];
[containerView addSubview:view2];
transitioning = NO;
}
-(void)dealloc
{
[containerView release];
[view1 release];
[view2 release];
[super dealloc];
}
-(void)performTransition
{
// First create a CATransition object to describe the transition
CATransition *transition = [CATransition animation];
// Animate over 3/4 of a second
transition.duration = 0.75;
// using the ease in/out timing function
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// Now to set the type of transition. Since we need to choose at random, we'll setup a couple of arrays to help us.
NSString *types[4] = {kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade};
NSString *subtypes[4] = {kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom};
int rnd = random() % 4;
transition.type = types[rnd];
if(rnd < 3) // if we didn't pick the fade transition, then we need to set a subtype too
{
transition.subtype = subtypes[random() % 4];
}
// Finally, to avoid overlapping transitions we assign ourselves as the delegate for the animation and wait for the
// -animationDidStop:finished: message. When it comes in, we will flag that we are no longer transitioning.
transitioning = YES;
transition.delegate = self;
// Next add it to the containerView's layer. This will perform the transition based on how we change its contents.
[containerView.layer addAnimation:transition forKey:nil];
// Here we hide view1, and show view2, which will cause Core Animation to animate view1 away and view2 in.
view1.hidden = YES;
view2.hidden = NO;
// And so that we will continue to swap between our two images, we swap the instance variables referencing them.
UIImageView *tmp = view2;
view2 = view1;
view1 = tmp;
}
-(void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
transitioning = NO;
}
-(IBAction)nextTransition:(id)sender
{
if(!transitioning)
{
[self performTransition];
}
}
@end
2010년 9월 8일 수요일
Custom UIBarButtonItem을 UIToolBar에 붙이기
UIBarButtonItem을 생성하려고 할 때, 초기화메서드들을 살펴보면
UIImage* image = [UIImage imageNamed:@"btn_left.png"];
– initWithBarButtonSystemItem:target:action:
– initWithCustomView:
– initWithImage:style:target:action:
– initWithTitle:style:target:action:
이렇게 네가지가있습니다. CustomView를 사용할 때만 target: action:을 설정하는 부분이 빠져있지요.
뷰를 붙여넣었기 때문입니다. UIView는 UIControl의 상위 클래스지요.
그러므로 Action을 설정하고 싶으면 CustomView의 인자로 UIButton을 사용하면 됩니다.
그리고 UIButton에 Action을 설정해 넣으면 됩니다.
UIImage* image = [UIImage imageNamed:@"btn_left.png"];
CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);
UIButton* someButton = [[UIButton alloc] initWithFrame:frame];
[someButton setBackgroundImage:image forState:UIControlStateNormal];
UIImage* image1 = [UIImage imageNamed:@"btn_leftTouch.png"];
[someButton setBackgroundImage:image1 forState:UIControlStateHighlighted];
[someButton setShowsTouchWhenHighlighted:NO];
UIBarButtonItem* someBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:someButton];
UIImage* imager = [UIImage imageNamed:@"btn_right.png"];
CGRect framer = CGRectMake(0, 0, imager.size.width, imager.size.height);
UIButton* someButtonr = [[UIButton alloc] initWithFrame:framer];
[someButtonr setBackgroundImage:imager forState:UIControlStateNormal];
UIImage* imager1 = [UIImage imageNamed:@"btn_rightTouch.png"];
[someButtonr setBackgroundImage:imager1 forState:UIControlStateHighlighted];
[someButtonr setShowsTouchWhenHighlighted:NO];
UIBarButtonItem* someBarButtonItemr = [[UIBarButtonItem alloc] initWithCustomView:someButtonr];
UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[toolBar setItems:[NSArray arrayWithObjects:flexibleSpace, someBarButtonItem,flexibleSpace, someBarButtonItemr, flexibleSpace, nil]];
2010년 9월 7일 화요일
UIAlertView 사용
-(void)showMessage
{
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"결혼 예정일을 설정해 주세요!"
message:@"예정일이 설정되어있지 않으면 스케쥴러를 사용할 수 없습니다."
delegate:self
cancelButtonTitle:@"취소"
otherButtonTitles:@"확인", nil];
[alertView show];
[alertView release];
}
UIAlertViewDelegate를 컨펌?한후에
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch(buttonIndex)
{
case 0:
break;
case 1: break;
}
}
2010년 9월 5일 일요일
2010년 9월 3일 금요일
UIScrollView에서 Zooming시 스크롤러가 point 0,0에서 재생성되는 문제
Zooming시 스크롤러를 enable시키는 방법으로 해결
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
[self scrollView].scrollEnabled = NO;
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
[self scrollView].scrollEnabled = YES;
}
2010년 9월 2일 목요일
한글주소 UTF8 인코딩
NSString * path = [[NSString stringWithString:[[tableList objectAtIndex:row] objectForKey:@"thumbnail_src"]]
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* aURL = [NSURL URLWithString:path];
NSLog(@"string : %@", [[tableList objectAtIndex:row] objectForKey:@"thumbnail_src"]);
NSLog(@"aURL : %@", aURL);
NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
NSLog(@"data : %@", data);
[cell.thumnailView setImage:[UIImage imageWithData:data]];
2010년 9월 1일 수요일
이미지뷰를 캡쳐하기
UIGraphicsBeginImageContext(cardView.frame.size);
[cardView.layer renderInContext:UIGraphicsGetCurrentContext()];
screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSString *imagePath = [model imagePath];
[UIImagePNGRepresentation(screenShot) writeToFile:imagePath atomically:YES];