【发布时间】:2015-11-24 08:35:21
【问题描述】:
我完全被难住了,已经研究了好几天。可能我错过了一些非常简单的东西。
我有一个 ViewController,其中包含一个名为 GameView 的自定义 UIView,还有一个名为 buttonBox 的 UIView,其中包含一个“下一级”按钮。我想要实现的是,当关卡在 GameView 中完成时,它会在我的ViewController 中触发一个函数,该函数显示按钮框,以便用户可以单击“下一级”按钮。它根本行不通。
我尝试了 3 种方法,但都没有奏效:
- 在
ViewController中创建一个IBOutlet,将其连接到隐藏的UIView(它肯定是连接的)并调用setHidden:NO。 - 拨打
[self.view viewWithTag:xxx],然后拨打setHidden:NO。 - 使用
hidden=NO代替setHidden:NO。
ViewController的相关代码如下:
@interface PlayViewController : UIViewController
@property GameView *gv;
@property (strong, nonatomic) IBOutlet UIView *buttonBox;
-(void) showButtonBox;
@end
@implementation PlayViewController
@synthesize buttonBox;
...
- (IBAction)showButtonBox {
UIView *uiv = (UIView*) [self.view viewWithTag:999];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Showing box function");
NSLog(@"%@", uiv);
uiv.hidden = NO;
});
}
@end
还有我的自定义视图:
@implementation GameView
...
dispatch_async(bgQueue, ^{
_loopRunning = true;
//NSLog(@"Calling main loop...");
while ([self loopRunning])
{
...
PlayViewController * pvc = [[PlayViewController alloc]init];
[pvc showButtonBox];
...
}
@end
问题是,变量 uiv 在NSLog 中返回 null,这显然是为什么 hidden 不起作用,但我不知道为什么。当我使用IBOutlet时它也不起作用。
另外,NSLog 的当前输出如下:
2015-11-24 00:18:38.612 ib[12579:1264539] Showing box function
2015-11-24 00:18:38.612 ib[12579:1264539] (null)
提前致谢。
正确答案:
问题是我使用 StoryBuilder 来构建我的 UI,但使用 alloc init 方法创建了一个新的视图控制器(从未显示),而不是正确引用正在显示的视图控制器。这是通过将正在显示的视图控制器传递给 viewDidLoad 函数中的视图来实现的,见下文:
@implementation PlayViewController
@synthesize buttonBox;
@synthesize gv;
- (void)viewDidLoad
{
[super viewDidLoad];
gv = [self.view viewWithTag:777];
[gv setPlayViewController:self];
}
...
【问题讨论】:
-
您确定您有一个标签为 999 且位于 self.view 中(而不是位于 self.view 中的另一个视图中)的视图吗?
-
您的游戏视图是否重叠并位于您的按钮上方?在运行时检查 xcode 中的可视化编辑器并确认 plz
-
你能看到按钮吗?点击注册了吗?到底出了什么问题?
-
@Fonix 该视图是 self.view 的子视图。
-
@SahebRoy 游戏视图不重叠。 UIV 返回 null,所以 setHidden 肯定不起作用。
标签: ios objective-c uiview hidden