gpt4 book ai didi

ios - 在 didSelectRowAtIndexPath 中调用 pushViewController 时无法显示 UIActivityIndi​​cator

转载 作者:行者123 更新时间:2023-11-28 23:08:29 26 4
gpt4 key购买 nike

这是我的代码...

- (void) threadStartAnimating {
[activityIndicator startAnimating];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
activityIndicator=[[UIActivityIndicatorView alloc] init];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center=[self tableView].center;
[[self tableView] addSubview:activityIndicator];

[NSThread detachNewThreadSelector:@selector(threadStartAnimating) toTarget:self withObject:nil];
EventController *eventController = [[EventController alloc] init];
[eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]];
[activityIndicator stopAnimating];
[[self navigationController] pushViewController:eventController animated:YES];
}

事件 Controller 包含一个需要几秒钟加载的网络服务。我可以让事件指示器显示的唯一方法是,如果我在那里抛出一个无限循环......我发现了一堆提到将它放在一个单独的线程中的例子,但它似乎不起作用。

最佳答案

您的问题是,如果您在 viewDidLoad 中获取数据那么在加载 View 之前不会调用该方法,这通常是在首次显示该 View Controller 的过程中。在您的情况下,这是在 pushViewController:animated: 期间打电话。

所以做你想做的事情的一种方法可能是交换这两行:

[activityIndicator stopAnimating];
[[self navigationController] pushViewController:eventController animated:YES];

但是,老实说,我会创建一个名为 EventControllerDelegate 的协议(protocol),对 id <EventControllerDelegate> 具有弱引用属性在你的EventController然后设置创建 EventController 的 View Controller 在你插入它之前作为代表。然后在委托(delegate)中定义一个方法并在您的 View Controller 中实现它,并在该方法中停止微调器。然后在EventController ,当您完成数据加载后,调用委托(delegate)方法。

编辑:如果您真的想在不定义委托(delegate)的情况下执行此操作,您可以尝试将代码更改为如下内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
activityIndicator=[[UIActivityIndicatorView alloc] init];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicator.center=[self tableView].center;
[[self tableView] addSubview:activityIndicator];

EventController *eventController = [[EventController alloc] init];
[eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]];

[activityIndicator startAnimating];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIView *v = eventController.view;

dispatch_async(dispatch_get_main_queue(), ^{
[activityIndicator stopAnimating];
[[self navigationController] pushViewController:eventController animated:YES];
});
});
}

它使用 GCD 是为了清晰和通常的“访问 View 属性以强制执行 loadView/viewDidLoad” hack。

关于ios - 在 didSelectRowAtIndexPath 中调用 pushViewController 时无法显示 UIActivityIndi​​cator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811316/

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