gpt4 book ai didi

ios - Objective-C - [self.view viewWithTag] 返回 null

转载 作者:行者123 更新时间:2023-11-29 01:26:59 25 4
gpt4 key购买 nike

我完全被难住了,已经研究了好几天了。可能是我遗漏的非常简单的东西。

我有一个 ViewController,其中包含一个名为 GameView 的自定义 UIView,以及一个名为 buttonBox 的 UIView,其中包含一个“下一级”按钮。我想要实现的是,当关卡在 GameView 中完成时,它会在我的 ViewController 中触发一个函数,该函数显示 buttonBox,以便用户可以单击“下一关”按钮。它根本行不通。

我尝试了 3 种方法,都没有用:

  • ViewController 中创建一个 IBOutlet,将其连接到隐藏的 UIView(并且确实已连接)并调用 setHidden : 没有
  • 调用[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

还有我的自定义 View :

@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 方法创建了一个新的 View Controller (从未显示),而不是正确引用正在显示的 View Controller 。这是通过将正在显示的 View Controller 传递给 viewDidLoad 函数中的 View 来实现的,请参见下文:

@implementation PlayViewController
@synthesize buttonBox;
@synthesize gv;

- (void)viewDidLoad
{
[super viewDidLoad];
gv = [self.view viewWithTag:777];
[gv setPlayViewController:self];
}
...

最佳答案

伙计,这很简单。我们来看看:

@implementation GameView
...
dispatch_async(bgQueue, ^{
_loopRunning = true;
//NSLog(@"Calling main loop...");
while ([self loopRunning])
{
...
PlayViewController * pvc = [[PlayViewController alloc]init];
[pvc showButtonBox];
...
}
@end

这里有一个问题:

dispatch_async(bgQueue, ^{

我假设,bgQueue 代表“后台队列”,这意味着它不是由主线程(UI 线程)提供服务的。话虽如此,这种期望还是太天真了

[pvc showButtonBox];

才能正常工作。只需将这段代码移动到主线程中即可。例如,您可以将上述代码行包装到主队列上的 dispatch_async 中。如果您的商店和/或标签没问题,这应该可以解决您的问题。干杯。

关于ios - Objective-C - [self.view viewWithTag] 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33888828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com