1. Project 생성
  1) Create a new Xcode Project -> Window based Application -> "TabBarNavi"

2. Tabbar 구현
  1) Interface Builder 실행(Mainwindow.xib 더블클릭) -> Library 창실행 (shift + Cmmnd + L ) ->Tab Bar Controller를 MainWindow.xib 윈도우로 Drag & Drop
  2) Tab Bar Controller 연동하기
    a. header 파일에 IBOutlet UITabBarController *mainTab; 선언
    b. source 파일에서 [window addSubview:mainTab.view]; 와 해제시 [mainTab release];를 선언함.
    c. MainWindow.xib 화면에서 App Delegate와 Tab Bar Controller의 mainTab을 연결함
  3) Tab Bar Controller 설정 
    a. MainWindow.xib 화면에서 Tab Bar Controller 선택 후 Attributes 창 실행 (Cmmnd +1)
    b. View Controllers 항목의 Title을 변경하고(첫번째, 두번째), Class 항목을 View Controller를 Navigation Controller로 변경함.
    c. "+" 버튼을 눌러, "세번째" Navigation Controller를 추가함. 
    d. 배경이 투명한 이미지를 활용하여 Tab 이미지 추가
      - resource 폴더에서 세개의 이미지 추가
      - MainWindow.xib 화면에서 Tab Bar Controller Tree 구조를 확장시킨 후, 각 Tab Bar Item의 Atrributes 윈도우에서 "Image"항목에서 해당하는 이미지를 지정함 

4. 뷰구현
  1) 세개의 뷰를 추가 
     a. Class 폴더 마우스 우측 클릭, Add -> New File -> "UIView Controller subClass" with Xib for user interface
         "FirstViewList", "SecondView", "ThirdView" 추가
  2) FirstViewList 에 Table View 연결
     a. FirstViewList.Xib를 열고, 라이브러이에서 "Table View"를 Drag  Drop한다.
     b. Table View 를 선택하고, FirstViewList의 File's Owner에 드래그해서, datasource와 delegate를 연결한다. 
     c. FirstViewList의 source파일에 table view의 필수함수 구현 (FirstViewList.m)
...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *kIdentifier = @"cell";
 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier];
 
if(cell == nil)
{
  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIdentifier] autorelease];
}
 
cell.textLabel.text = @"첫번째 뷰 리스트 입니다.";
 
return cell;
 }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 return 5;
}

...


continue ....





  3) View Controller Xib 연결하기
    a. Tab Bar Controller를 펼쳐 각 탭에 해당하는 View Controller를 선택하여 Attribute창(Cmmnd+1)에서 각각 해당하는 Xib를 설정하고, Identity창(Cmmnd+4)에서 Class를 신규로 추가한 클래스를 각각 지정한다. 

  4) Xib title 변경하기
-(id) initWithCoder:(NSCoder *)aDecoder
{
if(self =[ super initWithCoder:aDecoder])
{
self.title = @"첫번째 ^^";
}
 
return self;
}
 
5. Navigation 구현하기
  1) Detail 뷰추가 
    a. Class 폴더 마우스 우측 클릭, Add -> New File -> "UIView Controller subClass" with Xib for user interface
         "FirstViewDetail" 추가
    b. Label 객체 " 디테일 뷰 입니다." 추가
  2) 첫번째 테이블 화면에서, 각 셀 클릭시 디테일 뷰로 전환
...

#import "FirstViewDetail.h"

...

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UINavigationController *naviCtrl = self.navigationController;
 
FirstViewDetail  *FViewDetail= [[FirstViewDetail alloc]initWithNibName:@"FirstViewDetail"  bundle:nil];
 
[naviCtrl pushViewController:FViewDetail animated:YES]; 
}

  3) 두번째, 세번째 뷰에서 라벨 추가
   
Posted by 꿈을펼쳐라
,



1. 프로젝트 생성 
  1) Xcode - Create a new Xcode Project - Window Based Project - "MultiXib"
  2) "Navigation Controller" 추가
  3) Navigation Controller 관련 소스 추가
@interface MultiXibAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
IBOutlet UINavigationController *naviCtrl;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
// Override point for customization after application launch
[window addSubview:naviCtrl.view];
[window makeKeyAndVisible];
return YES;
}

- (void)dealloc {
[naviCtrl release];
[window release];
[super dealloc];
}
2. Xilb 파일 생성
 1) class 항목에서 마우스 우클릭 -> Add -> New File ...  ( 혹은 메뉴에서 File -> New File ...) 실행
 2) iPhone OS 항목중 Cocoa Touch Class를 선택하고, UIViewController 선택.
 3) option항목중 "With XIB for user interface"를 선택. Next
 4) 클래스 이름을 입력함 ( mainView, firstView, secondView 추가)


3. mainView MainWindow에 나타내기
  1) mainView.xib를 선택, view에 구분가능한 라벨 추가
  2) MainWindow.xib에서 "Navigation Controller"를 선택하고 Atrribute(Cmmnd + 1)창을 띄움 
  3) NIB 입력항목에 구현하고자 하는 .xib를 하나 선택함 (Main View













































4. TaleView 및 Navigation 기능 구현
 1) mainView에 TableView를 드럽하고, File owner's와 DataSource, Dellegate를 연결
 2) mainView.m 파일에 Table View의 필수 함수를 구현 
 3) 셀을 클릭했을 때, 각가의 xib와 연결하여는 기능


#import "MainXib.h"
#import "FirstXib.h"
#import "SecondXib.h"

@implementation MainXib


/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
   
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(int)section
{
 return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *kIdentifier
=@"cell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier];
 
 if(cell == nil){
  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIdentifier] autorelease];
 }
 
 if(indexPath.row==0)
 {
    cell.textLabel.text = @"첫번째 항목입니다.";
 }
 else
 {
  
  cell.textLabel.text = @"두번째 항목입니다.";
 }
   return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 UINavigationController *mainNavCon = self.navigationController;
 if(indexPath.row==0)
 {
  
  FirstXib *firstView = [[FirstXib alloc]initWithNibName:@"FirstXib" bundle:nil];
  [mainNavCon pushViewController:firstView animated:YES];
 }
 else
 {
  SecondXib *secondView = [[SecondXib alloc]initWithNibName:@"SecondXib" bundle:nil];
  [mainNavCon pushViewController:secondView animated:YES];
 }
}

- (void)dealloc {
    [super dealloc];
Posted by 꿈을펼쳐라
,



1. Project 생성하기
  1) Create a new Xcode Project -> Window-Base Application -> "NaviTest"

2. Navigation Control 구현하기
  1) IB 실행시킨 상태에서 Library창에서 Navigation Controller를 MainWindow.xib 창으로 Drag&Drop
  2) 헤더 파일에 해당변수 선언 / View 적용, 소스파일에서 해제 
@interface NaviTestAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window; 
IBOutlet UINavigationController *mainNav;
 }

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
// Override point for customization after application launch
[window addSubview:mainNav.view];
[window makeKeyAndVisible];
return YES;
}

- (void)dealloc {
//IBOutlet으로 선언한 변수는 반드시 해제해야함
[mainNav release];
[window release];
[super dealloc];
}
(## 향후 소스코드 내용은 포함은 헤더파일은 연두색, 소스파일은 하늘색으로 표현할 예정임)
  3)  MainWindow.xib에서 "Navi Test App Delegate"를 Drag&Drop으로 Navigation Controller에 한후, 헤더에서 선언한 mainNav를 선택함 ( Drag & Drop 방향 중요 : 반대방향으로 하면 다른 팝업이 뜸)

3. View 추가하기
  1) Library 창에서 "View Controller"를 선택해서 MainWindow.xib로 Drag & Drop하여 3개를 만들고, 각 View Controller의 Title을 "root/first/second:ViewController"로 설정한다. (Attributes 창에서 : Cmmnd + 1)
  2) View Controller에서 다른 Control이나 Object를 바로 올리면 안되고, Cocoa Touch에서 "View"를 Drag & Drop해서 화면을 덮어줘야 가능함.
  3) 각 뷰에 적당한 Label을 입력
  4) Source 추가
@interface NaviTestAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window; 
IBOutlet UINavigationController *mainNav;
IBOutlet UIViewController *rootView;
IBOutlet UIViewController *firstView;
IBOutlet UIViewController *secondView;

// 위를 이렇게 선언해도 문제는 없음  <---
// IBOutlet UIViewController *rootView, *firstView, *secondView;
// --->

 }

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
mainNav.viewControllers =[NSArray arrayWithObject:rootView];
 rootView.title =@"나는 루트뷰입니다.";
// Override point for customization after application launch
[window addSubview:mainNav.view];
[window makeKeyAndVisible];
return YES;
}

- (void)dealloc {
//IBOutlet으로 선언한 변수는 반드시 해제해야함
[rootView release];
[firstView release];
[secondView release];

[mainNav release];
[window release];
[super dealloc];
}
(## 향후 소스코드 내용은 포함은 헤더파일은 연두색, 소스파일은 하늘색으로 표현할 예정임)
  5) Delegate 연결 : MainWindow.xib의 "Navi Test App Delegate"를 각 View Controller에 Drag & Drop한 후 해당하는 변수에 연결한다.

4. 화면전환 네비게이션 구현하기
  1) rootView의 Label을 지우고, "table view"를 rootView window에 올려놓는다.
  2) "table view"를 사용할 때는 기계적으로 App Delegate와 dataSource/Delegate를 연동한다.
  3) table view의 require function을 추가
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *kIdentifier = @"cell";
 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier];
 
if(cell ==nil)
{
  cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIdentifier];
}
 
if (indexPath.row ==0) {
cell.textLabel.text = @"첫번째 행입니다.";
 }
 else {
cell.textLabel.text =@"두번째 행입니다.";
 }
 
 return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 return 2;
}

   4) firstView, SecondView 도 rootView와 마찬가지로  윈도우 위에 View를 덮고, 식별할 수 있는 라벨을 추가한다. 
   5) UITableViewDelegate의 도움말을 확인하여 필요한 함수 검색 ( 셀 마우스 클릭시 동작 이벤트 처리)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 if(indexPath.row ==0)
 {
  [mainNav pushViewController:firstView animated:YES];
 }
 else
 {
  [mainNav pushViewController:secondView animated:YES];
 }
}

 

Posted by 꿈을펼쳐라
,


  [강의 내용]
  1. Main Window 이외의 추가적으로 윈도우 생성 / 전환 / 삭제
  2. Window-Based Project


1.Project 생성하기
  1) Create a Xcode Project -> Window-based Application - > "ChangeView"
  2) Interface Builder 실행 -> Library (Shift + Cmmnd + L ) -> "View" ( Cocoa Touch) 2개를 MainWodw.xib 추가

2. View와 Xcode 연결 
  1) ChangeViewAppDelegate.h 파일에 view 관련 변수 추가
@interface ChangeViewAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
 
 IBOutlet UIView *firstView;
 IBOutlet UIView *secondView;

}

  2) Interface Builder와 변수 연결하기 
      a. MainWindow.xib 파일 내에 "Change View App Delegate" 항목을 선택한 후 마우스우클릭 ( 혹은 Cmmnd키를 누르고 마우스 좌클릭)을 통한 Drag&Drop으로 view 항목에 연결  
  3) view 변경
      a. MainWindow.xib에서 view를 선택하고 Identity("Cmmnd + 4") 창을 열어, Name 항목에 해당하는 명칭을 입력 
      b. Label 추가 : 명칭 입력 / 버튼 추가 : 명칭 추가 ( firstView, ㄴecondView 모두)  
  4) 생성된 뷰를 MainWindow에 반영하기 
      a. ChangeViewAppDelegate.m 파일,  didFinishLaunchingWithOptions함수에 첫번째 뷰 추가
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
// Override point for customization after application launch
[window addSubview:firstView];
[window makeKeyAndVisible];
 return YES;
}
  4) 뷰전환 기능 구현
      a. 함수선언 : ChangeViewAppDelegate.h 에 추가
-(IBAction) ChangeView;
      b. Delegate 연결 : firstView, secondView에 생성한 Button을 우클릭하여 MainWindow.xib의 "Change View App Delegate"에 Drag&Drop한 후 ChangeView 함수를 선택한다.  
      c. ChagneView 함수 내용 구현
-(IBAction) ChangeView
{
NSArray *subs = [window subviews];
 
//window 객체는 하나의 view를 가짐
[[subs objectAtIndex:0]removeFromSuperview];
 
if([subs objectAtIndex:0]== secondView)
{
[window addSubview:firstView];
}
else {
[window addSubview:secondView];
}
}

[질문] firstView, secondView는 alloc를 하지 않는가? 
  - (자답) 이미 Interface Builder를 통해 생성되어 있고, 마우스 우클릭 과정을 통해 각변수의 포인터로 연결시켰음. 

[질문] firstView, secondView를 Pointer 형이 아닌 UIView 변수로도 받을 수 있을까? 
  - 몰라, 해 봐봐..  -> 해봤는데, xib에서 Drag&Drop 기능도 안되고 컴파일시에도 헤더파일 선언부에서 에러가 발생하는 것으로 보아 무조건 포인터 형으로 받아야 됨.
 
Posted by 꿈을펼쳐라
,

1. 프로젝트 생성하기 
  1) Create a Xcode Project :View-based Project - "TableViewControl"  
      => 이름이 너무 길어, 나중 아이폰 실행화면에서, 아이폰 밑의 실행화일 명칭이 축소 생략되어 나타남. 
          ( 프로젝트 생성시 향후 실행화일 명을 고려해서, 적당한 길이로 명명)
  2) TableViewControlViewController.xib 더블클릭 Interface Builder 실행
  3) Library[Cmmnd + Shift + L ] 실행
    a. Object - Library - Cocoa Touch - Data Views - Table View 선택( Table View Controller 가 아님.) 
    b. "Table View"를 TableViewViewControler.xib의 View 화면 위로 Drag& Drop : 위치 약간 조절
  4) Inspector [Cmmnd + Shift + I] 실행 ( Table View 가 선택된 상태에서 실행)
    a. Identity tab : 
       - Style : plain / group  
       - Separator : None, Single Line, Single Line Etched (엷게 드러내다 : pain 뷰에서는 지원되지 않음)  
       # 해당위치에 마무스를 고정시켜 놓으면 각 항목에 해당하는 풍선도움말이 나타남.
  5) 아웃렛 연결하기
     a. View에 있는 "Table View"를 선택 (화면 반전, 잘 안 될경우, Title Bar "View" 부분 클릭후 재시도)
     b. 선택한 상태에서 "Ctrl"을 누른 상태에서, File's Owner에 -datasource, -delegate에 연결
         (마우스 오른쪽 클릭 후 Drag해도 동일 효과) 
       - datasource / delegate 두개는 protocol로 IB를 사용하지 않는다면 하나하나 코딩을 추가해야 한다.
       - datasource : table에 표현되는 data의 속성 설정
       - delegate : table 자체 속성을 설정
  6) 필수 함수 구현하기 
     a. source 파일을 선택 (*.h, *.m) 
     b. 메뉴 : Help - Developer Documentation 
     c. UITableViewDataSource 입력   : 
        Tasks - Configuring a Table View 항목에서 "required method"라는 항목을 확인 할 수 있음. 
     d. 위 "c"항목의 두개 함수 원형을 도움말에서 복사해서, "TableViewControlViewController.m" 파일에
       함수 형태로 추가   

// Table Cell 갯수
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
// indexPath에 해당하는 셀 생성
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *cIdentifier = @"cell";
 
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cIdentifier];
 
 if(cell ==nil)
 {
   cell = [[[UITableViewCell alloc]
      initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cIdentifier]autorelease];
 }
 
 cell.textLabel.text = @"아이폰 개발은 정말 재미있어~ "; 
 return cell;

}



2. 각 셀 항목에 특정 Data의 내용이 나타나도록 구현
  1) NSArray에 임의의 Text를 넣고, 각셀에 해당 내용이 출력되는 기능 구현
  2) 클래스 멤버 변수로 활용하기
    a. "TableViewControlViewController.h " 파일에  TableViewControlViewController클래스 내부에 선언
@interface TableControlViewController : UIViewController {
 NSArray *listData;
}

//Object-C에서 해당값을 사용하기 위한 get, set 관련 내용은 메크로 처리인듯함.( 확인필요)
@property (nonatomic, retain) NSArray *listData;
     b. "TableViewControlViewController.m" 파일에 다음의 내용 추가
#import "TableControlViewController.h"

@implementation TableControlViewController

// 뭐 헤더에서 선언한 listData를 동기화 해서 사용하겠단 그런 이야기 겠지.
@synthesize listData;
  3) 해당변수배열(listData)에 초기값 넣기
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
// NSArray 입력값의 맨 마지막이 "nil"임을 확인하자!
listData = [NSArray arrayWithObjects:@"SimVerse = Sim(ulate) + (Uni)Verse", @"세상을 시뮬레이션 하자", @"너무 허황되다구? ",@"난 가능하다고 생각해", @"힌트는 SNS 야", @"미래는 꿈 꾸는 자의 것이 아니라, 실천하는 자의 것이다.",nil];
[super viewDidLoad];
}
  4) 추가한 함수에 해당 내용 반영하기 및 메모리 삭제하기
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 return [listData count]  ;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *cIdentifier = @"cell";
 
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cIdentifier];
 
 if(cell ==nil)
 {
   cell = [[[UITableViewCell alloc]
      initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cIdentifier]autorelease];
 }
 
 cell.textLabel.text = [listData objectAtIndex:indexPath.row];
 
 return cell;

 
}

- (void)dealloc {
[listData release];
[super dealloc];
}



[질문] 어떤때는 return [listData count]와 같이 [ ]의 용도는?   (음.. 역시 Object-C도 빨랑 시작해야 겠군)
Posted by 꿈을펼쳐라
,


1. Xcode 설치하기
  1) http://developer.apple.com/  -> iPhone -> SDK 3.2  (20100610 현재 iPhone SDK 4.0 BETA도 공개)
     Xcode 3.2.2 and iPhone SDK 3.2  ( 급질문 : Xcode와 iPhone SDK는 일체형이냐? )

2. Xcode 실행하기
  1) 새프로젝트 시작하기
[Create New Project 실행화면]

      ㄱ. Navigation-Based Application : 
           - 상단의 바가 있어 Back-Forward  버튼이 있어 화면 전환을 순차적으로 진행가능 
      ㄴ. OpenGL ES Application : 
            - OpenGL ES 를 바로 실행할 수 있도록 세팅
      ㄷ. Split View-based Application : 
            - SDK 3.2 에 신규로 추가, 분할뷰 이용 가능
      ㄹ. Tab Bar Application : 
            - 화면 하단에 탭바가 위치한 어플
      ㅁ. Utility Application : 
            - 사용자 입력이 필요 없거나, 단순한 위젯 형태( Dialog based App)
      ㅂ. View-based Application : 
            - View Control 하나를 기본으로 세팅
      ㅅ. Window-based Application : 
            - 가장 기본적인 아이폰 어플. 윈도우 하나만 세팅   

2. Hello World 프로젝트 
   1) Create New Project  : View-Based Application 선택
   2) Xcode 실행화면 
     a. Classes : 프로젝트를 구성하는 대부분의 Object-C 기반의 클래스 소스파일 (헤더파일 *.h, 소스파일 *.m)
     b. Other Sources : Object-C 기반이 아닌 헤더 및 소스 파일 
                                 
     c. Resources : 이미지, 동영상 등 리소스 파일, 인터페이스 빌더 파일(*.xib)
     d. Frameworks : 프로젝트에서 사용하는 프레임워크
     e. Products : 컴파일 했을 때 발생하는 결과파일 ( 붉은색으로 표현된 파일은 존재하지 않음) 

  2) 인터페이스 빌더 : Drag & Drop을 통해 화면을 쉽게 구현할 수 있는 툴 
  
[인터페이스 빌더 & 라이브러리 창 실행화면]

      a. MainWindow.xib 파일 
        - 타 xib를 호출해서 구현  

      b. Library에서 Label을 끌어와 HelloWorldController.xib의 View에 추가  
      c. Label을 선택한 상태에서 " Menu - Tools - Inspector " 실행 
        - view Attribute : 화면 디스플레이 속성 정보 제어
        - view Connections: IB와 소스코드와의 연결해주는 기능
        - view Size : 화면 크기 
        - view Identify : 프로그래밍 속성 
  
  3) 도움말    
     a. Xcode : [Menu] Help - Developer's Document
     b. [option] Key + 더블클릭 : 간단 풍선 도움말 
     c. [option] + [command] Key + 더블클릭 : 팝업도움말
     d. [control] Key + 클릭 : 팝업메뉴
 

헉헉... 진도 정말 늦다

 
 

Posted by 꿈을펼쳐라
,


찾아기기 : http://www.appsnext.com/bbs/board.php?bo_table=iphonesdk&wr_id=23

1. 강좌를 시작하며
   1) 대상은 Object-C를 약간은 이해하고 있는 분.  Object-C는 설명하지 않음.
   2) XCode 내의 IB(Interface Builder)를 최대한 사용 ( 일반적으로 고수나 팀작업에서는 IB 사용을 최소화 함)

2. 강좌 커리큘럼
   1) XCode 사용하기
   2) 다중 Xib 사용하기 (짚이라고 읽음)
   3) Table Control 사용하기
   4) Navigation Control 사용하기
   5) TabBar Control 사용하기
   6) Paging Control 상요하기
   7) 기타 등등...   (늘어날 수 있음)

3. 강좌 목표
   1) XCode를 친숙하게 이용할 수 있음.
   2) 간단한 허접한 어플을 개발할 수 있는 수준 ( 천리길도 한걸음 부터... 욕심내지 마세요..^^)
      - 한번에 다 알려고 하지 마셈~~ 
      - 책을 통한 공부의 문제점 : 소스 코딩을 하느라 머리를 쓰지 않음 ( 열심히 코딩했으나, 세페이지 넘어
                                   가면 남는 것이 없음)  : 절대 공감 !!!


4. AppsNext 유료강의도 있답니다.  많이 이용해주세요. 이렇게 공짜 강의도 해주시는데...   저도 감사감사

Posted by 꿈을펼쳐라
,

KT 블로그에서 진행한 온라인 세미나를 생방송으로 들어며 정리한 내용입니다.

발표를 하신 KT 김성우 연구원님의 맛갈스럽고 재치있는 입담과 UX 뿐 아니라 IT 산업의 전반적인 동향을 정리하는데 좋은 자료 인듯합니다.

특히, "구글의 아이폰이 뜬 7가지 이유"는 매우 공감이 가면서, 많은 것을 생각하게 하네요.  
 

세미나 바로가기 : http://blog.kt.com/99 





발표 : KT 김성우 연구원
패널 : 이동석(SKT UX전략), 김준환 (삼성전자 UX책임), 이지현(서울여대 산디교수)

발표주제: 새로운 IT 패러다임에서의 UX의 변화와 도전


1. iPhone 돌풍으로 뜨는 UX
  1) 왜 iPhone이 떴는가?
     ㄱ. 4년간 하나의 기종만을 만듦 ( 애플의 휴대전화는 아이폰 뿐임)
     ㄴ. 이 모델 하나를 위해 세계의 Top 인력 100여명이 4년간 개발 담당 
     ㄷ. Top Manger가 직접 사업을 추진 ( 위임이나 관리만이 아닌...)
     ㄹ. 2번 실패를 거울로 삼음( Newton, 모토롤라 iPod Phone )
     ㅁ. 25년간의 우수한 IT 기술 및 UX 경험을 보유하고 있음(Mac OSX, 현존하는 가장 뛰어난 운영체제)
     ㅂ. Apple의 기업문화  Cult > Culture
     ㅅ. CEO가 스티브잡스이다.  

     옴니아 -> 시집갈때 좋은 남편감???
     아이폰 -> Sexy Romantic 한 얼짱남자  
   
     옴니아가 Spec.이나 기능 면에서 아이폰보다 뛰어남. 

  2) iPhone이 가져온 새로운 UX 세계 
    ㄱ. 진정한 모바일 인터넷 
      아이폰으로 인해 모바일 인터넷 사용이 보편화 되었음.
      ( 미국 모바일 인터넷 사용량 : 아이폰의 시장점유율 대비 인터넷 데이터 사용량이 월등함) 
    ㄴ. seamless UX  : 애플의 각각의 제품/서비스와  밀접하게 연결/연동되어 있음.
       iPhone - iTunes - AppStore ... 
    ㄷ. Elegance in Interation Experience  
    ㄹ. 세티즌 iPhone UX 만족도 설문조사 : 전체보다 30% 이상 높게 나옴


2. 새로운 패러다임을 엿보다
  1) iPhone 100일이 만든 모바일 혁명 
    ㄱ. 무선 인터넷의 대중화
    ㄴ. 스마트폰 열품
    ㄷ. 앱스토어의 유행
    ㄹ. Walled Gerden 붕괴 
  2) 모바일 시장의 권력 구도 재편성
    ㄱ. 이통사 -> 플랫폼 오너
  3) 소프트웨어 산업의 변화 : 유통과 사용
    ㄱ. 앱스토어
    ㄴ. 클라우드 컴퓨팅,   서버사이드 프로그램
  4) Emerging Device & M2M Network
  5) IT생태계 형성 
    - 상호의존적
    -  Win -Win 
    -  Open
    - 지속가능한 사업의 동반자 관계

3. 새패러다임 속의 UX 변화와 도전 
  1) 일관성에 대한 종교적 믿음을 버려라 !  획일적 표준화는 이제 그만...
    - 예전 이통사에서 단말기 표준화를 위한 UI는 필요 없음 ( 이미 플랫폼에서 규격화된 UI를 제공하고 있음)
  2) UX Standardization 2.0 
     - Coherence > Consistency  :
         Coherence - a state of situation in whick all the parts or ideas fit together well so that they form a unied whole.
  3) Different UI , Same UX  :  N Screen - 다양한 제품군에서 same UX를 구현 
     - art of Indwelt coherence   : 내재하다, 깃들다.
  4) Classic UI Principle 의 확장
     - easy to learn,   zero security concern, sustainability, MMI, Human value,
   5) 체험의 통섭 : UX 생태계
      - UX 통합, seamless, 소비자의 충성도를 높임.


[토론]
1. UX 가치의 지속 가능성
  - 이동석 : UX의 전략없이는 성공할 수 없다. 아이폰이 월등함에 동의함.
  - 이지현 : UX라는 용어에 애착이 큼 ( 2001년 부터 관련 업무 수행), UX라는 용어는 애플에서 처음 사용
                UX 
  - 김준환 : UX 디자인의 처음 정의와 지금의 정의는 많이 변화하였음. 
                위기 : 구체적인 성과를 내기에는 아직 부족함.
                HW 중심 -> SW 중심 -> UX 중심으로 올 것이다. 
                중요한 프로젝트에 UX 담당이 부여되지 않은 경우는 없다. 
  - 이지현 : 5년 후 UX 가치,   현재, UX에 거품이 있는 것은 사실.  
                구글의 경우, 2002년 부터 UX 디렉터가 배정 ( 그전 엔지니어가 HCI적 지식으로 해결) 
               전문화 및 매뉴얼화는 진행되지만, 이후에는 ???
  - 이동석 : 미국 UX 구인 : 자동차 보험, 일반 보험, 
                 UX 관련 업무가 점점 마케팅과 비지니스 쪽으로 확대되어가 고 있음. 
                 기존의 모습과는 다른 형태로, 지속적으로 확대되어 갈 것임.
  - 김성우 : job 자체가 존재는 하겠지만, 지금과 같은 명칭으로는 존재하지 않을 것같음.
                진입장벽은 낮아지고, 요구사항은 높아짐.
                누구나 다 UI를 기본으로 하지 않을까. 

Q&A : UX의 한계?  가치성의 끝은? 
   - 김성우 : 한계가 불문명한 것이 한계임. 
   - 이동석 : 인간의 인지력 자체가 블랙박스. input에 대한 인간의 반응에 대한 활용이 UX
                  제품의 요구사항을 만족하면서 사람들이 잘 사용할 수 있게 하는 것.
 Q&A : SW 개발시 UX에 대한 고민을 어디까지 해야 하나?
   - 김성우 :  전통적으로는 클릭수를 줄이는 것이 목표.  피처의 갯수가 떨어짐(기능의 적음). 체험이 좋아짐.
                  어쩔수 없음. 무한 경쟁임. 끊임없이 연구해서 알아내는 것. 
   - 이지현 : SW UX를 하기 위해서는 Total Eng.임.  손대야 할 것이 더 많이 필요함.  
                  SW분야가 오히려 명쾌하게 떨어지는 분야임. 계속 열심히 하시길

2. IT 생태계의 권력 변화 : Platform Owner가 UX에 절대 권력을 갖고 있는가?  동일 플랫폼에서 제품을 만들어낼때, 경쟁우위 확보 방안
   -  이동석 : Experience ( google, apple, samsumg, SKT) 가체가 전략,  Android 기반 삼성폰  SKT 통신
   - 통합적 UX
   - HTC는 플랫폼 UX에서 많이 바꿈. 모토롤라는 조금 바꿈, 삼성은 많이 바꿈, 엘지는 조금 바꿈
   - 구글안드로이드팀 150명 -> 넥서스원 만든 이유,  UX의 표준화를 예시.  
   - 이지현 : 플랫폼, 지도 모바일 광고 분야는 자사들이 가져가고자 함.
                 결국, 플랫폼이 갖는 경쟁우위를 어쩔 수 없을 듯.  
 Q&A : 국내에서는 플랫폼이나 UX가 나오지 않는 이유 ?
   - 김성우 : TV를 통한 앱스토어를 구상, 삼성전자 바다
   - 이동석 : 세상이 갑자기 변할 줄 몰랐다.  내년 절반 이상 스마트폰으로 가져와, 절반 이상 터치폰으로 가져와.
                 이통사의 새로운 돌파구가 필요.   
                 우리나라  H/W 사업자들의 포트폴리오 장사,  S/W 역량이 떨어짐( 10년이상 코딩한 사람이 없음)  
                 UX 수준 = UX의 능력 * SW개발 능력 * 경영층의 마인드
    - 이지현 : 스티브잡스가 OSX를 만들때도, 개발자들이 못만들다고 했음.  
                  경영층에 마인드 능력이 중요.  
                  결국 구현하기 위해서는 SW Engineer의 능력이 필수.  
    - 김준환 : 우리나라 주로 밥벌이는 HW 생산 기반 
                   세계 1위를 한 이후, 어디를 바라봐야 하는가 에 혼란..   최근에 발생한 일. 
  Q&A : WAC(Wholesale App Community)  전세계 이통사들이 모여 앱스토를 만들겠다. (SKT / KT / 삼성전자 / 엘지전자 참여)
     -  김성우 : KT의 경우, 이머징 디바이스에 관심이 많음.
     - 이동석 : 위피는 힘들것.  3Screen, 2 Screen 전략.

3. 건너뜀

4. 애플이나 구글이 UX를 잘하는가? 우리나라는 왜 못하는가? 
     - 김준환 : 필요한 곳에 집중할 줄 아는 것.  
                무엇을 위해서 이기술을 사용할 것인가? 
                UX 부서가 사용자에 대해, 어느 부서보다도 잘 알아야함. 디자이너만의 고유한 독창성으로 살아 남아야.
    - 이지현 : 구글같은 data driven decision making 시스템이 잘 되어 있음. 
                  애플의 경우, 테크놀로지 중심으로 설계되는 경우가 있고, 피쳐가 에드하면서 설계하는 경우가 있음. 
                  리콰이어먼트에 대한 정확한 수립.
                  구글의 data에 대한 이해.   패널의 이메일이 모두 지메일임. 
    -  이동석 : UX 디자이너로써 기업의 UX를 높이려면, 사장 혹은 부사장의 마음을 얻어 신뢰를 얻어야함. 
                   최고 경영자와 2단계 이내 보고 라인 
                   UX 관련 상무님을 모시는 것.  구글 메리사마이어 UX 부사장. 
    - 김성우 : UX를 잘하려면 기업 전반에 인식이 필요함.  CXO의 필요성  
                  애플의 경우, 잡스형님 주도로 바벨탑을 쌓는 형상
                  구글의 경우, 완성되지 않은 만리장성을 쌓고 있는 느낌.

    Q&A : UX를 넘어선 개념 UX의 경우, 개인(대중)적인 경험을 중시.  지하철에서 많은 사람들이 모두 아이폰을 쓰고 있음.  많이 사용하면 많이 사용할 수록 좋아짐.  개인을 넘어선 대중의 공통된 무엇을가를 추구.   하나의 예술품으로 인식.  예술품을 넘어선 어떤 것...  종교?  나이키 나 비틀즈,   아이폰은 경험을 넘어선 문화 단계가 아닌가 
    Q&A :  중소기업의 제품 개발시 UX 고려시 시행착오를 줄일 수 있을지.. 
       김준환 : 뛰어난 UX 디자이너만으로는 성과를 얻기 힘듦 ( 각 부서간 하나의 목표를 공유하고 하나된 모습으로 움직이는  모습 :  오히려 중소기업이 유리) 
       이동석 : UX는 결국 확률 게임 ( UX를 올려서 높일 수 있는 효과 ), 시행착오를 하지 않으면 지식이 쌓이지 않음.
       이지현 : 조직화 구현 사례( 이베이) 를 연구해서 내부를 설득

    Q&A : 삼성 모바일 월드 컨퍼런스,  구글이나 애플의 UX 대비, 삼성전자의 방향성.
        김성우 : 바다   삼성은 휴대폰 보다는 이머징 디바이스에 더 촛점을 맞춤. 
        이동석 : 안드로이드 전자랜지, 안드로이드 세톱박스,
Posted by 꿈을펼쳐라
,