- (IBAction)doSomething:(id)一般使用的发送者模型

时间:2012-05-25 15:21:53

标签: iphone

所以我对某些事情感到好奇,并且不确定是否存在某种“标准”或“良好”的编码习惯。如果你有一个主页,例如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] 

我应该重构这些方法吗?如果是这样,那么这样做的好方法是什么?谢谢!

2 个答案:

答案 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重构为另外一种方法,该方法将转换动作(按钮或其他标志)的逻辑与实际执行动作(推动导航控制器)分开。