0

所以我对某事感到好奇,不确定是否有“标准”或“良好”的编码实践。例如,如果您有一个带有 3 个按钮(如 facebook iphone 应用程序仪表板)的主页,通过按下视图控制器进入应用程序的各个部分,然后在一个按钮上,我会将 IBAction 绑定到它:

- (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 初始化

例如

SummaryViewController *detailViewController = [[[SummaryViewController alloc] 

我应该重构这些方法吗?如果是这样,有什么好方法可以做到这一点?谢谢!

4

2 回答 2

0

问题1:不要重复代码只是使用[self showSummary:nil];

问题2:重复代码。它们是具有不同任务的不同对象,因此请将它们分开。

于 2012-05-25T15:23:17.513 回答
0

我不会分别回答问题 1 和 2,而是建议对您的代码设计进行一些修改,以实际回答这两个问题。

绝对不要重复viewDidLoad中的代码。虽然这是一个简单的示例,但复制/粘贴代码绝不是一个好主意,不这样做的一个很好的理由是,当您在代码块中发现错误时,您必须在复制/粘贴的任何地方应用该更改它。很有可能,你要么会生气这样做,要么你会忘记一个地方并留下一个潜伏的错误。完成不复制/粘贴代码的最简单方法是简单地调用[self showSummary:nil]; 我会建议一种更清洁的方法,因为从 viewDidLoad 的上下文中使用“sender”参数是没有意义的。

以下是我的建议(假设您已经将三个按钮设置为 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];
}

现在有些人会争辩说这有点难以理解,因为作为查看您的代码的第 3 方人员,我想知道您为什么要将按钮传递给该方法。相反,您可以考虑将 showSummary 重构为一个额外的方法,该方法将翻译动作(按钮或其他标志)和实际执行动作(推动导航控制器)的逻辑分开。

于 2012-05-25T16:32:30.463 回答