考虑到我有UIViewController
名为ErrorViewController
,我使用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.
关于委托方法,最佳做法是通过传递参数或通过检查传递的控制器的属性来检查类型,如下所示:
- (void)ErrorPage:(ErrorViewController *)ErrorPage
// check ErrorPage.errorType
}
或者这个:?
- (void)ErrorPage:(ErrorViewController *)ErrorPage
andErrorType:(ErrorType)errorType
// check errorType
}
答案 0 :(得分:2)
我认为这是一个偏好问题。如果对象无法正确运行而没有错误类型和/或委托,则最好提供自定义初始化程序。
至于你的第二个问题,我会提供第二个例子中的错误类型。请注意,方法名称应该以小写字符开头(-errorPage:
而不是-ErrorPage:
)。
另外,如果你经常使用它,我会提供一个方便类方法来创建对象:
+(ErrorViewController*) standardErrorViewControllerWithErrorType: (ErrorType) errorType andDelegate: (id<ErrorDelegate>) delegate {
ErrorViewController *evc = [[ErrorViewController alloc] initWithNibName: @"ErrorViewController" bundle: nil andErrorType: errorType andDelegate: delegate];
return evc;
}
修改强>
此外,在您的init方法中,我们鼓励您使用-(instancetype) init...
代替-(id) init....