2011-08-23 5 views
2

그래서 iPhone 용으로 개발할 앱과 관련하여 흥미로운 디자인 문제가 있습니다. 이미지를 조작하는 앱을 만들고 있는데, 수행 할 수있는 다양한 유형의 조작이 있습니다. 따라서 사용자는 앱을 열고 어떤 유형의 조작을 수행할지 선택하고 단계별 절차를 통해 조작을 수행합니다.iOS App에 관한 복잡한 디자인 질문

많은 조작이 비슷하므로 코드를 여기에서 다시 사용할 수 있습니다. 따라서 각 조작의 각 창에 대한보기 제어기를 작성하는 대신 하나의보기와 하나의보기 제어기를 작성하기로했습니다. 뷰에는 각 이미지 조작 단계가 포함되어 있으며 다음 단계로 넘어갈 때마다 이미지 자체를 적절하게 재구성합니다. 뷰 컨트롤러는 네비게이션 컨트롤러에 의해 제어되며 사용자가 수행하려는 이미지 조작의 다음 단계로 넘어갈 때마다 (예 : 스택에 새 뷰 컨트롤러를 밀어 넣음) 뷰 객체의 복사본을 만듭니다 , 해당 구성 요소를 적절한 단계로 재구성하도록 설정 한 다음,이를 표시 할 새보기 제어기로 보내십시오.

내 질문에, 조작의 몇 가지 단계에 대한 컨트롤러를 볼 수있는 보편적 인 도구 모음에 일부 단추를 추가해야합니다 (모달보기이므로이 도구 모음에 홈 단추가 있습니다. 사용자가 기본 화면으로 돌아갈 수있게 해줍니다). 기본적으로이 방법에 접근하는 방법에 대한 몇 가지 질문이 있습니다.

1)보기 컨트롤러 대신 사용중인보기에 도구 모음을 추가해야합니까? 그렇다면 툴바의 홈 버튼을 어떻게 모달 뷰에서 빠져 나올 수 있습니까?

2) 뷰 컨트롤러에 툴바를 유지하고 뷰를로드 할 때 뷰에 일련의 단추를 추가해야합니까? 그런 다음 내 모든보기 메서드를 내 View Controller에 나열해야 할 것 같습니까?

3) 뷰 컨트롤러에 툴바를 유지해야하지만 툴바에서 뷰 객체에 포인터를 보내고 뷰 클래스 내에 버튼을 추가해야합니까? 내 뷰 클래스에 내 액션 메서드를 추가 할 수 있습니까?

불편을 끼쳐 드려 죄송합니다. 궁금한 사항이 있으면 알려 주시기 바랍니다.

+0

프로세스가 진행되는 동안 툴바가 표시됩니까? 그렇다면 다른 펜 안에 중첩 된보기 컨트롤러를 만드는 것이 가장 좋습니다. 이렇게하면 포인터 위치와 관련하여 바뀌지 않는 상단에 도구 모음이 있습니다. 그 아래의 영역은 자체보기 컨트롤러를 통해 필요에 따라 수정할 수 있습니다. – justin

+0

내가 만드는 각보기 컨트롤러 객체에는 동일한 도구가 있습니다. 바 (그것에 홈 버튼과 함께). 화면 공간이 내 앱에서 중요하기 때문에 툴바는 하나만 갖고 싶습니다. 나는 뷰 컨트롤러를 중첩시킬 수 있다는 것을 알지 못했다. –

+0

기본적으로 탐색 기반 응용 프로그램을 사용하는 것과 같은 아이디어입니다. 맨 위에있는 막대가 항상 표시되므로보기간에 이동할 수 있습니다. 유사한 접근 방식을 사용하는 경우 막대에 대한 정적 참조를 유지하여 필요에 따라 추가/제거 할 수 있습니다. 그런 다음 각각의 뷰에서'self.root.toolbar'와 유사한 호출을 통해 툴바를 얻을 수 있습니다. 이것은 어쨌든 내가 할 일입니다. 정보를 전달하고보기를 좀 더 쉽게 추적 할 수 있습니다. – justin

답변

0

마침내이 문제에 대한 해결책이 생겼습니다. 내가 한 일은 UIViewController에서 분명히 상속받은 UIMainViewController라는 보편적 인 뷰 컨트롤러를 만드는 것입니다. 내 응용 프로그램에 대한 그래서

- (void) viewDidLoad 
    { 
     [super viewDidLoad]; 

     [self assembleToolbarButtons]; 
     [[self navigationController] setToolbarHidden:NO]; 
     [self setToolbarItems: toolbarButtons]; 
     [[[self navigationController] toolbar]setBarStyle:UIBarStyleBlack]; 
    } 

    - (void) assembleToolbarButtons 
    { 
     NSMutableArray *toolbarButtonsTemp = [[NSMutableArray alloc] init]; 
     [self setToolbarButtons: toolbarButtonsTemp]; 
     [toolbarButtonsTemp release]; 

     if ([self mode] == UIMainViewControllerMainMode) 
     { 
      UIBarButtonItem *createAPictureButton = [[UIBarButtonItem alloc] initWithTitle:@"Create" style: UIBarButtonItemStyleBordered target:self action:@selector(loadCreateAPictureModalViewController)]; 
      UIBarButtonItem *accountButton = [[UIBarButtonItem alloc] initWithTitle:@"Account" style: UIBarButtonItemStyleBordered target:self action:@selector(loadAccountModalViewController)]; 
      UIBarButtonItem *helpButton = [[UIBarButtonItem alloc] initWithTitle:@"Help" style: UIBarButtonItemStyleBordered target:self action:@selector(loadHelpModalViewController)]; 

      [[self toolbarButtons] addObject: createAPictureButton]; 
      [[self toolbarButtons] addObject: accountButton]; 
      [[self toolbarButtons] addObject: helpButton]; 

      [createACaptionButton release]; 
      [accountButton release]; 
      [helpButton release]; 
     } 
     else 
     { 
      UIBarButtonItem *homeButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style: UIBarButtonItemStyleBordered target:self action:@selector(exitModalViewController)]; 

      [[self toolbarButtons] addObject: homeButton]; 

      [homeButton release]; 
     } 


    } 

-(void) loadCreateAPictureModalViewController 
{ 
    CreateAPictureViewController *createAPictureViewController = [[CreateAPictureViewController alloc] initWithMode:UIMainTableViewControllerModeModal]; 
    UINavigationController *createAPictureNavController = [[UINavigationController alloc] initWithRootViewController: createAPictureViewController]; 

    [[createAPictureNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController:createAPictureNavController animated:YES]; 

    [createAPictureNavController release]; 
    [createAPictureViewController release]; 
} 

-(void) loadAccountModalViewController 
{ 
    AccountViewController *accountViewController = [[AccountViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal]; 
    UINavigationController *accountNavController = [[UINavigationController alloc] initWithRootViewController: accountViewController]; 

    [[accountNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController: accountNavController animated:YES]; 

    [accountNavController release]; 
    [accountViewController release]; 
} 

-(void) loadHelpModalViewController 
{ 
    HelpViewController *helpViewController = [[HelpViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal]; 
    UINavigationController *helpNavController = [[UINavigationController alloc] initWithRootViewController: helpViewController]; 

    [[helpNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController: helpNavController animated:YES]; 

    [helpNavController release]; 
    [helpViewController release]; 
} 

-(void) exitModalViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

, 그것의 ViewController 각, 사진을 만드는 계정에 액세스하거나, 도움을 액세스하기위한 기본 버튼이 하단에 툴바를해야합니다에 다음과 같은 나는 도구 모음을 구현합니다. 이 버튼 중 하나에 액세스하면 모달보기가 시작되어 모달보기를 종료하는 홈 버튼이 나타납니다 (UIMainViewController가 만들어 질 때 매개 변수 중 하나가 매개 변수가 어떤 모드인지 알려주므로 어떤 도구 모음 버튼이 추가.

하지만 주요한 것은 도구 모음 단추를 저장하기 위해 클래스 mutablearray varialbe를 만든 다음 "assembleToolbarButtons"에 단추가 만들어 졌기 때문입니다. 이제 UIMainViewController에서 상속받은 모든 클래스가 자신을 추가하기 위해 assembleToolbarButtons를 재정의 할 수 있습니다 버튼이 이미 추가 된 주요 것들 맨 위에있는 버튼

처음에는 하나의 UIView를 사용하고 자체를 재구성하는 것과 관련하여 uiviewcontroller 하나만을 사용하여 피할 수 있었고 대신에 separa를 만들었습니다 각 단계에 대한 컨트롤러보기 및 MVC 준수를위한보기 분리.

0

1) 확인.

해고의 경우보기에보기 컨트롤러에 대한 포인터가 있습니까? 다음과 같은 경우는 어떻습니까?

정확하게 계층 구조가 어떻게 구성되어 있는지 잘 모르는지 확실하지 않습니다. 그건 내 추측이야.

2) 나에게는 너무 괴롭다. 보기에서 단추가 원하는 것을 설명하는 데이터 구조를 정의하고 목록을 작성해야합니다. 뷰 컨트롤러는 해당 목록을 요청하고이를 통해 이동해야합니다.

3) 최상의 옵션 인 것 같습니다. 하지만 당신의 견해는 툴바에 서브 뷰를 직접 추가하지는 않을 것입니다. ToolbarView 사용자 지정보기를 만듭니다. title, target, action과 같은 버튼에 필요한 필수 속성을 설명하는 매개 변수와 함께 일종의 addButton 메서드를 제공하십시오. 툴바보기로 위치, 위치 등을 결정할 수 있습니다.

동작 클래스를 뷰 클래스로 사용할 수 있습니까? 그래, 그렇다고해서 안된다. 추천 된 iPhone 디자인 패턴은보기가 을 수행하지 않아야한다는 것입니다.을 수행하면 아무 것도 표시하지 않아야합니다. 일을하는 메소드는 뷰 컨트롤러에 있어야한다. 뷰 컨트롤러가하는 일은 뷰의 표시를 변경하는 것이다.

+0

부모보기 컨트롤러에 대한 포인터가 실제로 없습니다. 궁극적으로 필자가 원하는 뷰 내에서 도구 모음을 배치하면 그렇게해야 할 것이라고 생각합니다. 피하기 위해. 그래서 내 뷰 클래스에 단추를 만들고이를 내 View Controller로 반환 한 다음 내 동작 클래스를 내보기 클래스에 넣으면 여전히 그 위치를 알 수 있습니다. –