这是我的第一个iOS应用。
我正在使用导航控制器和标签栏控制器制作应用。每个标签栏控制器都有一个表视图,其中每个单元格可以加载另一个表,或者可能是带有数据的自定义视图(如一堆标签和图像) - 它取决于内容。我是以编程方式进行的。
因为我这样做是为了尽可能灵活,我认为将视图彼此分开可能是一个好主意,这样如果添加了设计,布局或新数据,可以很容易地删除新视图到最后的观点之一。我这样做的目的是让我可以随时改变主意。然而,这让我感到焦虑,因为有些事情是不对的。
标签表示相关类型的数据(例如音乐,电影,视频),表格单元表示基于较大标签的类别(专辑封面,巡演日期,乐队推特等)的类似属性。由于所有信息都可能如此不同,我想这样做。在表格视图的最后,单元格选择将是具有适当数据的自定义视图。不过,它始终以表格视图开头。
AppDelegate.m
ViewController1 *vc1 = [[ViewController1 alloc] init];
ViewController2 *vc2 = [[ViewController2 alloc] init];
ViewController3 *vc3 = [[ViewController3 alloc] init];
ViewController4 *vc4 = [[ViewController4 alloc] init];
ViewController5 *vc5 = [[ViewController5 alloc] init];
UITabBarController *tbc = [[UITabBarController alloc] init];
NSArray *viewControllers = [NSArray arrayWithObjects:vc1, vc2, vc3, vc4, vc5];
[tbc setViewControllers:viewControllers];
// nav controller is a property because another initial method returns the the view if conditions are met
[self.nc = [[UINavigationController alloc] initWithRootViewController:tbc];
[[self window] setRootViewController:self:nc;
[self.window makeKeyAndVisible];
这会将一组视图控制器设置到选项卡栏中,然后将其放入导入控制器中,该控制器将加载到视图中。
所有ViewController#.m
个文件看起来都很相似:
- (void) viewDidLoad {
[super viewDidLoad];
self.tabBarController.title =@”Title”;
TableViewController# *tvc = [[TableViewController# alloc] init];
UIView *new = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 420, 420);
[self addChildViewController:tvc];
[new addSubview:tvc.view];
[self.view addSubview:new];
}
表视图然后正常加载其单元格。目前,单元格并未连接到目标视图,因为出现了这个问题。这有效,但感觉非常脏和不正确。标签栏控制器加载一个视图,其目的是加载另一个视图?这不可能是正确的,但这是我能想出来的唯一方法。我必须为每个后续的tableview做这个吗?!我将拥有一百个视图控制器,这让我感到非常震惊。
此外,设置CGRect似乎工作正常,但我不得不放入一个空的表页脚,因为无论我设置什么尺寸,它总是将单元格放在标签栏下面。非常不优雅。虽然它似乎在3.5“vs 4”设备上运行良好,但我不知道为什么,我设置了静态视图大小,对吗?
在进入太深之前,我可以通过哪些方法优化此工作流程?如果故事板是答案,那么请指出一个非常好的教程,当我使用故事板时,我似乎无法正确连接。
答案 0 :(得分:0)
尝试使用少数ViewControllers的多个实例。可以根据您的数据模型相应地配置所有内容。大多数模态VC和表VC都可以重复使用。您最终可能会有十几个VC,或者可能会更多但最初这很好 - 通过继承和协议,您将能够实现高度的代码可重用性。在apple dev处查看示例应用 并阅读基础知识。我现在不会太担心风格或整洁。刚刚完成第一个版本。
答案 1 :(得分:0)
在我看来,您可以在界面构建器中执行此处显示的大量代码。 默认情况下,许多IBOutlet都有弱引用 - 有利于内存优化。
此外,由于您要通过硬编码来添加视图,因此您必须在超级视图中为它们定义不同的维度或位置if(... 3.5 inch){one dimensions} .. if(4 inch)(other dimensions)
例如bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
或#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
。
当然,如果目的是学习如何手写它 - 那么它就是另一种情况。