所以我对某些事情感到好奇,并且不确定是否存在某种“标准”或“良好”的编码习惯。如果你有一个主页,例如3个按钮(比如facebook iphone应用程序仪表板),通过按下一个视图控制器进入应用程序的各个部分,然后在一个按钮上,我会将IBAction绑定到它: / p>
- (IBAction)showSummary:(id)sender {
SummaryViewController *detailViewController = [[[SummaryViewController alloc] initWithNibName:@"SummaryViewController" bundle:nil] autorelease];
detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
detailViewController.view.autoresizesSubviews = YES;
[self.navigationController pushViewController:detailViewController animated:YES];
}
所以我的第一个问题是,让我们说第一次启动应用程序时,我想首先显示此页面。所以在viewDidLoad中,我可以只调用这个方法
[self showSummary:nil];
或者在viewDidLoad中使用相同的代码更好。
关于这个的第二个问题是重构。如果我的所有3个按钮在创建viewController并将其推入堆栈时执行相同操作,则唯一的区别是viewController到初始化程序
e.g。
SummaryViewController *detailViewController = [[[SummaryViewController alloc]
我应该重构这些方法吗?如果是这样,那么这样做的好方法是什么?谢谢!
答案 0 :(得分:0)
问题1:请勿使用[self showSummary:nil];
问题2:重复代码。它们是具有不同任务的不同对象,因此请将它们分开。
答案 1 :(得分:0)
我不会单独回答问题1和2,而是建议对代码设计进行一些修改,以便实际回答这两个问题。
绝对不要在viewDidLoad中重复代码。虽然这是一个简单的例子,复制/粘贴代码绝不是一个好主意,一个不这样做的好理由是,当你发现代码块中的一个错误时,你将不得不在你复制/粘贴的任何地方应用这个改变它。有可能,你要么是生气,要么你会忘记一个地方并留下潜伏的虫子。完成不复制/粘贴代码的最简单方法是简单地调用[self showSummary:nil];
我建议使用更简洁的方法,因为使用viewDidLoad上下文中的“sender”参数是没有意义的。 / p>
这就是我建议的内容(假设您已将三个按钮设置为button1,button2和button3。用您自己的替换这些变量):
- (IBAction)showSummary:(id)sender {
UIViewController *detailViewController = nil;
if (sender == self.button1) {
detailViewController = [[[SummaryViewController alloc] initWithNibName:@"SummaryViewController" bundle:nil] autorelease];
} else if (sender == self.button2) {
detailViewController = [[[SummaryViewController2 alloc] initWithNibName:@"SummaryViewController2" bundle:nil] autorelease];
} else if (sender == self.button3) {
detailViewController = [[[SummaryViewController3 alloc] initWithNibName:@"SummaryViewController3" bundle:nil] autorelease];
}
//You can accomplish these two lines in the nib file. Do it there unless there's a reason to change these separately per controller, it simplifies the code
//detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//detailViewController.view.autoresizesSubviews = YES;
[self.navigationController pushViewController:detailViewController animated:YES];
}
然后从viewDidLoad中调用指定要为其模拟操作的按钮的方法。
- (viewDidLoad) {
[self showSummary:self.button1];
}
现在有些人认为这有点难以理解,因为作为第三方人看着你的代码,我想知道为什么你把按钮传递给那个方法。相反,您可以考虑将showSummary重构为另外一种方法,该方法将转换动作(按钮或其他标志)的逻辑与实际执行动作(推动导航控制器)分开。