我有一个像这样的控件:
MyCustomControl *control = [[MyCustomControl alloc] initWithNavigationController:self.navigationController];
control.completion = ^{
[self controlCompletedAction];
};
[control showFromView:self.view];
但是,由于它没有被任何内容保留,因此在尝试调用某些方法时,控件会获得错误的访问权限。
将控件保留在调用类的属性中可以正常工作,例如:
@property(nonatomic, strong) MyCustomControl *control;
或
@interface MyViewController {
MyCustomControl *control;
}
两者都很好。
但是我不想为我正在制作的每个不同控件添加属性。 控件的目的是分离功能以避免大规模视图控制器。该属性不对视图控制器中的任何其他内容负责,因此没有理由保留它。
那么,有没有办法使用属性/ ivar或使用objc运行时来保留控件 不 ?
答案 0 :(得分:0)
如果您愿意,可以使用实例变量(实质上是全局变量)而不是属性。它看起来像这样:
@interface YourClass {
MyCustomControl *control;
}
答案 1 :(得分:0)
你应使用属性,因为属性传达了所有权的概念,这使您的代码更易于理解和维护。
也许您不愿意将控件设置为实例化它的视图控制器的属性,因为它不属于到该视图控制器。那么问题就变成了控制属于什么?如果它属于导航控制器,请考虑将导航控制器子类化并将控件添加为导航控制器属性。
如果控件是UIView的子类并且将被添加到视图层次结构中,则不需要将其保留为属性,因为它将由超级视图保留,并在不再位于视图层次结构中时释放。
如果我的建议对您没有意义,您能否提供有关控件本身的更多信息?
答案 2 :(得分:0)
您可以在自定义控件类中使用static
变量,但前提是同时只有一个MyCustomControl
实例(如popover,但即使它需要强变量)。
代码示例:
// MyCustomControl.m
static MyCustomControl * _currentInstance = nil;
-(void)showFromView:(UIView *)fromView
{ [_currentInstance dismiss];
// show code here ...
_currentInstance = self;
}
- (void)dismiss
{ // remove your control
_currentInstance = nil;
}