如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?

Posted

技术标签:

【中文标题】如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?【英文标题】:How can I open a new view from a background thread without knowing what the current/main-view is?如何在不知道当前/主视图是什么的情况下从后台线程打开新视图? 【发布时间】:2011-02-22 11:23:50 【问题描述】:

据我了解,任何打开的新视图都需要有父视图/超级视图。

我有一个与服务器通信的后台线程,根据服务器的响应,它需要弹出一个警报,并且为了响应该警报,它需要调出一些 UI。这可能发生在我的应用程序中的“任何地方”,因此我发现很难为这个新视图提供父视图/超级视图。

是否可以在不知道当前显示的内容的情况下打开这个新视图?是否有一种非侵入式的方式来检测当前视图并将其用作父/超级视图?

其中一个目标是不要求代表和其他视图提供任何内容。

【问题讨论】:

【参考方案1】:

获取当前可见视图的方式取决于控制器的设置,例如。无论您是否使用标签栏、导航控制器等。我认为最简单的方法是,只要您需要更改 UI 时,您的后台线程就会在主线程上发送通知(使用 NSNotificationCenter)。然后,视图控制器可以订阅此通知并处理 UI 更改。

通知只是一种通信方式,基本上你想要的就是让你的模型后台线程以某种方式向你的主线程上当前活动的视图控制器发送消息。具体如何处理这在很大程度上取决于您的应用程序(再次参见第一句话)。

【讨论】:

我需要在不向委托/视图/视图控制器添加代码的情况下执行此操作,这可能吗? 只要能拿到当前可见窗口的实例就可以了,但这不是很好的设计习惯。 MVC 的存在是有原因的,只有控制器才应该修改显示的视图,否则你最终会遇到一个贫民区和非常难以调试的错误。【参考方案2】:

其实你不需要视图,你可以将它添加为你的应用代理窗口的子视图。

在您的应用程序委托中:

- (void) showView 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480)];
    view.backgroundColor = [UIColor redColor ];
    [self.window addSubview:view];
    [view release];

然后,当你想显示视图时:

MyAppDelegate *d = [[UIApplication sharedApplication] delegate];
[d showView];

完成后,您需要一种方法来关闭视图,您可以使用

[self removeFromSuperview]

【讨论】:

是否可以在不向代理添加代码的情况下调出/关闭这个新视图?理想情况下,“后台线程”可以单独处理,问题是这是否可能。 没试过,但可能是“[[[[UIApplication sharedApplication] delegate] window] addSubview:view];”有效...你可以试一试。

以上是关于如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道个人资料 ID 的情况下从我的应用打开 LinkedIn 应用?

是否可以在不知道它们是啥的情况下覆盖所有 css 样式? [复制]

在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#

处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是啥的情况下将任何类型转换为 NSString

如何在不将控制器添加到视图层次结构并使其可见的情况下从 UIViewController 获取 UIView?

java - 在不知道模式的情况下从字符串中提取当前日期模式