我试图理解单身人士的使用。我有红色要小心他们,但他们也可以有积极的用途。
我的情景:
目前我已经设置了测试项目。一个ViewController有一个需要执行操作的按钮。
FirstViewController上有一个UIWebView。
我正在使用Storyboard和ContainerView,所以我可以同时看到两个ViewControllers。
在第一个ViewController中,我在.m文件中有这个代码:
static FirstViewController *sharedController = nil;
+ (FirstViewController *)sharedController {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
//BBCSermonTabBarViewController *myVC = (BBCSermonTabBarViewController *)[storyboard instantiateViewControllerWithIdentifier:@"BBCNews"];
if(sharedController == nil)
sharedController = (FirstViewController *)[storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];
return sharedController;
}
我还有一个方法可以改变它的alpha值:
-(void)hideWebView
{
_webView.alpha = 0.3;
}
现在在我的第二个视图控制器中,我有这个代码:
-(IBAction)hideWebViewFromAnotherViewController
{
[[FirstViewController sharedController] hideWebView];
}
该动作按钮现在是否会更改另一个ViewController中的webView的alpha?
如果不是我做错了什么?
提前致谢: - )
答案 0 :(得分:1)
为了安全起见,并且因为使用libdispatch它很容易,你应该使用dispatch_once()调用来保护单例创建者,而不是进行if()检查。
+ (FirstViewController *)sharedController {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
static dispatch_once_t token;
dispatch_once(&token, ^{
sharedController = (FirstViewController *)[storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];
});
return sharedController;
}
token
像信号量一样用来保护块,并确保它只在程序运行期间被调用一次;它不受种族和同时阅读的影响。
答案 1 :(得分:1)
我很欣赏你更好地理解单身人士的目标,但我建议不要使用单身人士,除非你必须这样做。
我不认为在大多数UI场景(我从来没有需要)中有单身人士是合适的。我建议在对象之间进行通信的以下方法之一:
保留对要与之通信的对象的引用。只需添加一个属性并保存对稍后需要调用的类的引用。如果它适用于您的场景,您可以将其作为弱引用。
使用iOS / Objective-c应用程序常用的委托模式。与上面相同,不同之处在于定义协议。通常,该属性称为delegate
。这允许其他视图使用通用接口进行通信。
使用通知中心。在大多数情况下,我不喜欢这个选项,但是如果有很多视图可能需要了解的事件,并且您不想处理对对象的传递引用,那么它可能是一个不错的选择。 / p>
当我真正需要依赖首次使用时实例化类的单例行为时,单身人士在我的经验中最适合非UI代码。在您的情况下,看起来您使用单例的唯一原因是在整个应用程序中访问该视图控制器。
答案 2 :(得分:0)
它应该工作。潜在问题:_webView为nil,[FirstViewController sharedController]没有返回有效的引用。在hideWebViewFromAnotherViewController上设置断点并逐步执行,确保在您认为时定义了所有内容。