我花了很多时间来更好地理解 Objective-C 中的委托。我让它适用于大多数情况,但在特定情况下存在问题,我觉得很难理解。让我解释一下我想要做什么:
我有一个名为 的自定义视图GridLayoutView
,它是UIView
. 我还有一个视图控制器SomeViewController
,它是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
. 我想知道这是否是与代表团合作的好方法还是有更好的方法?如果有人能为我解决这个问题,我将不胜感激。