考虑到我有一个名为UIViewControllerErrorViewController正在使用initWithNibName实例化。
这个ErrorViewController上有一个枚举描述它的“类型”。
这个ErrorViewController有一个委托函数,返回给它的委托,它将根据ErrorViewController上设置的类型做出响应。
最好在新的initWithNibName函数中传递所有参数,并在ErrorViewController上设置私有属性。这样地:

ErrorViewController *errorVc = [[ErrorViewController alloc]
initWithNibName:@"ErrorViewController" bundle:nil
andErrorType:kErrorTypeA andDelegate:self];

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
andErrorType:(ErrorType)errorType andDelegate:(id<ErrorDelegate>)delegate{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.delegate = delegate;
        self.errorType = errorType;
    }
    return self;
}

或者更好的做法是实例化对象并随后设置其公共属性,如下所示:
ErrorViewController *errorVc = [[ErrorViewController alloc]
initWithNibName:@"ErrorViewController" bundle:nil];
errorVc.delegate = self;
errorVc.type = kErrorTypeA.

对于delegate方法,最佳实践是通过传递参数来检查类型,还是通过按如下方式检查返回控制器的属性:
- (void)ErrorPage:(ErrorViewController *)ErrorPage
// check ErrorPage.errorType
}

或者这个:?
- (void)ErrorPage:(ErrorViewController *)ErrorPage
andErrorType:(ErrorType)errorType
// check errorType
}

最佳答案

我认为这是一个偏好的问题。如果对象在没有错误类型和/或委托的情况下无法正常工作,那么最好提供自定义初始化器。
关于第二个问题,我将提供第二个例子中的错误类型。注意方法名应该以小写字符开头(-errorPage:而不是-ErrorPage:)。
另外,如果你经常使用它,我会提供一个方便的类方法来创建对象:

+(ErrorViewController*) standardErrorViewControllerWithErrorType: (ErrorType) errorType andDelegate: (id<ErrorDelegate>) delegate {

  ErrorViewController *evc = [[ErrorViewController alloc] initWithNibName: @"ErrorViewController" bundle: nil andErrorType: errorType andDelegate: delegate];
return evc;
}

编辑
此外,在in it方法中,鼓励使用-(instancetype) init...而不是-(id) init....

10-08 02:14