0

这是我的第一个 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 英寸和 4 英寸设备上运行良好,但我不知道为什么,我设置了静态视图大小,对吗?

在深入了解之前,我可以通过哪些方式优化此工作流程?如果故事板是答案,那么请指点我一个非常好的教程,当我使用故事板时,我似乎永远无法正确连接。

4

2 回答 2

0

尝试使用少数 ViewController 的多个实例。一切都可以根据您的数据模型进行相应配置。您的大多数模态 VC 和表格 VC 都是可重用的。您可能会以总共十几个 VC 结束,或者可能更多一些,但最初这很好 - 通过继承和协议,您将能够实现高度的代码可重用性。在apple dev
上查看示例应用程序 并阅读基础知识。我现在不会太担心风格或整洁。完成第一个版本。

于 2013-06-27T21:23:37.007 回答
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)在方法实现之前。

当然,如果目的是学习如何手动编写它 - 那么它是另一种情况。

于 2013-06-27T21:37:25.110 回答