所以我对一个我正在为iPhone开发的应用程序有一个有趣的设计问题。我正在创建一个操纵图像的应用程序,并且可以执行不同类型的操作。因此,用户打开应用程序,并选择他们想要执行的操作类型,并通过一步一步的过程来执行操作。
很多操作都很相似,所以代码可以在这里重用。因此,我决定创建一个视图和一个视图控制器,而不是为每个操作的每个窗口创建一个视图控制器。视图包含每个图像操作的步骤,每次增加到下一步时,它都会适当地重新组织。视图控制器由导航控制器控制,每次用户前进到他们尝试执行的任何图像操作的下一步(即在堆栈上推送新的视图控制器)时,我制作了我的视图对象的副本,将其设置为将其组件重新组织到适当的步骤,然后将其发送到将显示它的新视图控制器。
所以我的问题是,对于操作的某些阶段,我需要将一些按钮添加到附加到视图控制器的通用工具栏上(因为这是一个模态视图,这个工具栏将有一个主页按钮,使用户能够退回到主屏幕)。基本上,我对如何处理这个问题有几个问题:
1)我应该只将工具栏添加到我正在使用的视图中,而不是视图控制器。如果是这样,我如何让工具栏上的主页按钮退出模态视图?
2)我应该将工具栏保留在视图控制器上,并在视图加载时让我的视图返回一组要添加到其中的按钮吗?然后我想我必须在视图控制器中列出我的所有动作方法?
3)我应该将工具栏保留在视图控制器上,还是将工具栏中的指针发送到我的视图对象,然后在视图类中添加按钮?我可以在我的视图类中添加我的动作方法吗?
无论如何,对不起,如果这很复杂,如果您有任何跟进问题,请告诉我。
答案 0 :(得分:0)
1)好的。
对于解雇,您的视图是否有指向视图控制器的指针?这样的事情怎么样:
[self.viewController.parentViewController dismissModalViewControllerAnimated:YES];
不确定我是否完全了解您的层次结构的组织方式。这只是我的猜测。
2)这对我来说似乎很愚蠢。您必须定义某种数据结构,该结构描述视图在按钮中的内容,并列出它们的列表。视图控制器必须请求该列表,然后通过它们。
3)这似乎是最好的选择。但我不会让您的视图直接将子视图添加到工具栏。创建ToolbarView自定义视图。给它一些addButton方法,其参数描述了你想要按钮的基本属性,比如标题,目标和动作。让ToolbarView决定它的外观,位置等等。
您的操作方法可以继续使用您的视图类吗?是的,我想,但他们不应该。推荐的iPhone设计模式是视图不应该做任何东西,它们应该只显示东西。执行操作的方法应该在视图控制器上,即使他们做的唯一事情是更改正在显示的视图。
答案 1 :(得分:0)
我终于想出了一个解决方案。我所做的是创建一个名为UIMainViewController的通用视图控制器,它显然继承自UIViewController。我实现了如下工具栏:
- (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,我避免了这个,而是为每个步骤和单独的视图创建单独的视图控制器,以便更多地遵守MVC。 / p>