Objective-C での委譲について理解を深めるために多くの時間を費やしました。ほとんどのケースで動作しましたが、特定のケースに問題があり、理解が困難です。私がやろうとしていることを説明しましょう:
GridLayoutView
のサブクラスであるというカスタム ビューがありUIView
ます。SomeViewController
のデリゲートであるView Controller もありGridLayoutView
ます。
カスタムinitWithFrame
メソッドがあり、条件付きで別の初期化メソッドを呼び出していますbaseInit
。そのメソッドは、ある時点でデリゲート メソッドを呼び出します。からのコードは次のGridLayoutView
とおりです。
//
// Delegator
// GridLayoutView.m
//
@implementation GridLayoutView
- (id)initWithFrame:(CGRect)frame
numberOfRows:(NSUInteger)rows
numberOfCols:(NSUInteger)cols
{
self = [super initWithFrame:frame];
if (self) {
self.numberOfRows = rows;
self.numberOfCols = cols;
self.numberOfCells = rows * cols;
if (self.numberOfCells > 0) [self baseInit];
}
return self;
}
- (void)baseInit
{
// do some more initialization stuff here
// ...
// then call a delegate method
[self.delegate someMethod:someObj];
// However, this method is not called because self.delegate is nil
}
およびからのいくつかのコードSomeViewController
:
//
// Delegate
// SomeViewController.m
//
@implementation SomeViewController
// ...
// in some method
self.gridLayoutView = [[GridLayoutView alloc] initWithFrame:gridLayoutFrame
numberOfRows:rowsCount
numberOfCols:colsCount];
self.gridLayoutView.delegate = self;
// ...
デリゲート メソッドは 内baseInit
で呼び出されることはありません。これは、デリゲートがnil
その時点にあり、メソッドが完了した後に設定さinitWithFrame
れるbaseInit
ためです。私はこれを確認しました。
委任のワークフローに何か問題があるように感じます。解決策はありますが、それが最善の方法だとは思いません。解決策は、基本的に、次のようなメソッドSomeViewController
を変更して、インスタンスを委任者に渡すことです。initWithFrame
- (id)initWithFrame:(CGRect)frame
numberOfRows:(NSUInteger)rows
numberOfCols:(NSUInteger)cols
delegate:(id<GridLayoutViewDelegate>)aDelegate
このアプローチは機能しますがSomeViewController
、GridLayoutView
そのinitWithRect
. これが委任を行う良い方法なのか、それともより良いアプローチがあるのか 疑問に思っていますか? 誰かが私のためにこれをクリアできれば、とても感謝しています。