2011-11-28 5 views
1

방금 ​​객관적인 C 및 iOS 개발을 배우기 시작했으며 iPhone 앱을 iPad로 마이그레이션하는 데 어려움을 겪었습니다.iOS SplitView/Universal help needed xcode 4.2

나는 헤드 퍼스트 아이폰 & iPad 개발 2 판을 읽었지만, 7 장의 "iPad로 이전 중"은 xcode 4.2에서 구식이다. 앱은 테이블 뷰 및 세부 뷰와 함께 스플릿 뷰를 사용하는 방법을 보여주는 데모입니다.
iPhone에서 Universal로 iOS Application Target을 변경할 때 MainWindow-iPad.xib 자동 생성 기능이 있습니다. 그러나 이것은 xcode 4.2에서 나에게 일어나지 않습니다. AppDelegate에서 프로그램 적으로 splitview 컨트롤러를 만들었습니다. 여기 코드는 다음과 같습니다

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     MasterViewController *firstVC = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; 
     self.secondVC = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease]; 

     UINavigationController *firstVCnav = [[[UINavigationController alloc] initWithRootViewController:firstVC] autorelease]; 
     UINavigationController *secondVCnav = [[UINavigationController alloc] initWithRootViewController:self.secondVC]; 

     UISplitViewController *splitVC = [[UISplitViewController alloc] init]; 
     splitVC.viewControllers = [NSArray arrayWithObjects:firstVCnav, secondVCnav, nil]; 

     self.window.rootViewController= splitVC; 
     [self.window makeKeyAndVisible]; 
     return YES; 
    }else { 
     MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; 
     self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; 
     self.window.rootViewController = self.navigationController; 
     [self.window makeKeyAndVisible]; 
     return YES; 
    } 
} 

splitview (테이블 뷰)의 왼쪽이 잘 수행되고,하지만 난이 서로 다른 행을 선택하면 변경할 수있는 권리 측면 (상세 편)을 얻을 수 없다 왼쪽. 다음은 MasterViewController 클래스에있는 코드입니다. 여기

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     AppDelegate *splitVCdetails = [[AppDelegate alloc] init]; 
     [splitVCdetails.secondVC drinkChanged:[self.drinks objectAtIndex:indexPath.row]]; 

    }else { 
     if (!self.editing) { 
      if (!self.detailViewController) { 
       self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease]; 
      } 
      self.detailViewController.drink = [self.drinks objectAtIndex:indexPath.row]; 
      [self.navigationController pushViewController:self.detailViewController animated:YES]; 
     }else { 
      AddDrinkViewController *editingDrinkVC = [[AddDrinkViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
      editingDrinkVC.drink = [self.drinks objectAtIndex:indexPath.row]; 
      editingDrinkVC.drinkArray = self.drinks; 

      UINavigationController *editingNavCon = [[UINavigationController alloc] initWithRootViewController:editingDrinkVC]; 

      [self.navigationController presentModalViewController:editingNavCon animated:YES]; 
      [editingDrinkVC release]; 
      [editingNavCon release]; 
     } 
    } 
} 

-(void)refreshView { 
    //Set up our UI with the provided drink 
    self.drinkTextLabel.text = [self.drink objectForKey:NAME_KEY]; 
    self.ingredientTextBox.text = [self.drink objectForKey:INGREDIENTS_KEY]; 
    self.directionTextBox.text = [self.drink objectForKey:DIRECTIONS_KEY]; 
} 

-(void)drinkChanged:(NSDictionary *)newDrink { 
    self.drink = newDrink; 
    [self refreshView]; 
} 

가 난 아무것도 명확히 할 필요가 있으면 알려 주시기 바랍니다 내가 DetailViewController 클래스에있는 코드입니다.

고맙습니다.

답변

1

"헤드 퍼스트 iPhone 및 iPad 개발"도 읽고 있습니다. KevinM의 코드 의 도움으로 프로그래밍 방식으로 xib없이 UISplitController를 만들었습니다. 여기 내 해결책이있다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (!self.editing) { 
     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
      [self.splitViewDetailView drinkChanged:[self.drinks objectAtIndex:indexPath.row]]; 
     } 
     else { 
      self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease]; 
      self.detailViewController.drink = [self.drinks objectAtIndex:indexPath.row]; 
      [self.navigationController pushViewController:self.detailViewController animated:YES]; 
     } 
    } 
    else { 
     AddDrinkViewController *editingDrinkVC = [[AddDrinkViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 
     editingDrinkVC.drink = [self.drinks objectAtIndex:indexPath.row]; 
     editingDrinkVC.drinkArray = self.drinks; 

     UINavigationController *editingNavCon = [[UINavigationController alloc] initWithRootViewController:editingDrinkVC]; 

     [self.navigationController presentModalViewController:editingNavCon animated:YES]; 
     [editingDrinkVC release]; 
     [editingNavCon release]; 
    } 
} 

그리고에 책 코드를 추가 : 나는 MasterViewController.m에있는 코드 여기

#import "AppDelegate.h" 
#import "MasterViewController.h" 
#import "DetailViewController.h" 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize navigationController = _navigationController; 
@synthesize splitViewController = splitViewController_; 

- (void)dealloc 
{ 
    [_window release]; 
    [splitViewController_ release]; 
    [_navigationController release]; 
    [super dealloc]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    // Override point for customization after application launch.  
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; 
     UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; 

     DetailViewController *detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil] autorelease]; 
     UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease]; 

     masterViewController.splitViewDetailView = detailViewController; 

     self.splitViewController = [[[UISplitViewController alloc] init] autorelease]; 
     self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController, detailNavigationController, nil]; 

     self.window.rootViewController = self.splitViewController; 
    } 
    else { 
     MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; 
     self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; 
     self.window.rootViewController = self.navigationController; 
    } 

    [self.window makeKeyAndVisible]; 
    return YES; 
} 

됩니다 : 여기

내가 AppDelegate.m의 시작 부분에있는 코드입니다 345 페이지 (refreshView 메서드) 및 346 페이지 (splitViewDetailView 속성)