我正试图想出一个很好的方法来组织UIViewControllers之间的转换,从控制器本身中删除逻辑。我想出了一个基于我喜欢的Pro ObjC设计模式书的模式,但我想知道如何改进它。
简而言之。原谅半伪代码。
我将UINavigation Controller子类化,并创建了一个方法,所有View Controllers在需要转换时都会调用它。
-(void)requestViewChangeByObject:(id)object withData:(object*)someData{
if ([object isKindOfClass:[ViewController1 class]]) {
[self showViewController2Animated:YES withSomeData:nil];
}
if ([object isKindOfClass:[ViewController2 class]]) {
[self showViewController3Animated:YES withSomeData:someData];
}
if...
}
然后我只为每个控制器定义了方法。有些只是实例化并推送控制器和一些设置属性或传递信息。
-(void)showViewController2Animated:(BOOL)animated withSomeData:(object*)someDataVariable{
viewController2 *VC2 = [viewController2 defaultViewController];
[self pushViewController:VC2 animated:animated];
}
-(void)showViewController3Animated:(BOOL)animated withSomeData:(object*)someDataVariable{
viewController3 *VC3 = [ViewController3 defaultViewController];
VC3.someData = someDataVariable
[self pushViewController:VC3 animated:animated];
}
我这样做的原因是因为它使应用程序在更改控制器顺序和添加/删除控制器方面更加灵活,因为设计和要求发生了变化。我们也倾向于重复使用应用程序,这样可以更轻松地重新组织和重组以构建新的应用程序。
我遇到的主要问题是应用程序越复杂,所有if语句将获得的方法越大。如果请求来自viewController3,如果涉及更多逻辑而不仅仅是推送viewController2,可能会让人感到困惑。我真的很想知道如何改进它,以便它更灵活,更不容易造成混淆和错误。
其次,当您向问题添加传递数据时,它不是很灵活。我最终取出了接受数据对象的参数,并创建了一个单独的单例管理器对象来处理保存/获取我需要的数据,我理解这不是好设计。但是,当我尝试在像Apple建议的控制器之间来回传递数据时(即在上面的代码中设置控制器上的属性),它只是变得混乱,我觉得有更好的方法来做到这一点。
所以对此有任何建议将不胜感激。