SetNeedsDisplay 不起作用

2023-11-24

我看到了许多与此问题相关的线程,但没有一个解决我的情况(我认为)。

我的情况应该很简单,我有一个自定义UIView在我的控制器中,从我的控制器中,我使用 [self.myView setNeedsDisplay] 并且效果完美。

当我尝试从内部调用它时遇到问题UIView本身...我有一个从另一个类发送的通知,我的视图(这有效)正在接收它及其传递的信息,我更新此视图的内部属性,然后我调用 [selfsetNeedsDisplay] 希望我的屏幕更新为新状态,但什么也没有发生,我使用了NSLOG在我里面drawRec方法,此时它没有被调用,只有当我的控制器类调用setNeedsDisplay,当发生这种情况时,屏幕上会显示之前应该发生的更新...我不知道为什么它之前没有更新...

这是一些代码:

我的控制器请求更新:(工作正常!)

- (void)addNodeToNetwork:(DTINode *)node
{
[self.myNetwork addNodeInTheNetwork:node];
self.gridView.nodesToDraw = [self.myNetwork.nodesInNetwork copy];

CGRect tempRec = CGRectMake(node.nodePosition.x, node.nodePosition.y node.nodePosition.x, node.nodePosition.y);
NSValue *rectObj = [NSValue valueWithCGRect:tempRec]; //transforma o cgrect num objeto

[self.gridView.fatherNodes setValue:rectObj forKey:node.nodeName];
[self.gridView setNeedsDisplay];
}

我的通知方法尝试更新我的绘图:(不起作用!)

- (void) receiveTestNotification:(NSNotification *) notification
{
NSDictionary *userInfo = notification.userInfo;
DTINode *notificationNode = [userInfo objectForKey:@"myNode"];
NSLog(@"Im Here!");
for (DTINode *node in self.nodesToDraw)
{
    NSLog(@"Here too");

    if(node.nodeName == notificationNode.fatherNode)
    {
        CGRect temp = CGRectMake(notificationNode.nodePosition.x, notificationNode.nodePosition.y, node.nodePosition.x, node.nodePosition.y);
        NSValue *tempObj = [NSValue valueWithCGRect:temp];
        [self.fatherNodes setObject:tempObj forKey:notificationNode.nodeName];
        [self setNeedsDisplay];
        NSLog(@"Should REDRAW NOW!"); // It print this but no drawing is made!
    }
}
}

我不贴我的drawRect在这里,因为它有效,问题是不是从我的内部调用UIView setNeedsDisplay!

任何人都知道为什么这不起作用???


经过大量测试,我看到了一些与线程相关的东西,事实上 setNeedsDisplay 应该只在主线程中调用...此外我从未在此类中启动单独的线程,引发通知的类位于辅助线程中...显然这是导致问题的原因......

为了解决这个问题,我只是强制在主线程中调用 setNeedsDisplay 。

dispatch_async(dispatch_get_main_queue(), ^{
            [self setNeedsDisplay];  
});

Swift 3:

DispatchQueue.main.async { [weak self] in
    self?.setNeedsDisplay()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SetNeedsDisplay 不起作用 的相关文章

随机推荐

  • 为什么App更新后不兼容平板电脑

    我有一个应用程序 它已经推出了 2 年多了 并且自平板电脑问世以来就受到平板电脑的支持 我有一台 Asus Transformer 平板电脑 用于平板电脑测试 在我进行更新之前 该应用程序与平板电脑设备兼容 对于我最近的一组更改 我在 An
  • 如何使用 ngStyle (angular2) 添加背景图像?

    如何使用 ngStyle 添加背景图像 我的代码不起作用 this photo http dl27 fotosklad org ua 20121020 6d0d7b1596285466e8bb06114a88c903 jpg div div
  • Win32 相当于 .net SendKeys

    我正在设计一个从 Kinect 读取手势并执行一些操作的系统 我正在尝试包含能够将 HotKey 发送到应用程序的系统 我的系统是用 C 编写的 但 UI 是用 C net 编写的 我已经能够从 UI 部分使用 SendKeys 并且它确实
  • 如何在没有用户交互的情况下初始化全屏

    您好 我是初学者 我想创建一个网络应用程序 并且在页面加载时需要全屏帮助 无需用户交互 我在点击功能上有类似的东西可以正常工作 但我想在起始页加载功能 addEventListener click function var el docum
  • 将源代码隐藏在 .jar 文件中

    人们可以轻松提取 jar文件并查看源代码 我想保护源代码不被看到 一种可能的答案是使用密码保护文件 就像我们对 zip 文件所做的那样 但是 如果知道密码 则可以轻松查看源代码 有没有什么方法可以隐藏源代码并仍然能够运行 类似于什么 exe
  • python:使用 PyCharm 和 PyQt5 时进程已完成,退出代码 1

    我有三个 Python 3 4 3 脚本 其中之一是用于控制 PyQt5 生成的 ui 文件 当我运行 GUI 程序时 它接受所有数据和所有内容 当我按 InputDialog 上的 确定 按钮时 窗口将关闭并显示控制台 Process f
  • JavaScript 字符串赋值运算符

    我怎么可以用 在字符串上 但我不能使用 on it 例如 var test Test var arr 8660 test arr alert test Shows Test 8660 test arr alert test Shows Na
  • .net core 1.1:外部程序集的 Type.GetType 返回 null

    我正在将控制台应用程序移植到 NET core 该应用程序从外部库加载类型 在完整的 NET Framework 中使用Type GetType typename assemblyname 当程序集位于与可执行文件相同的文件夹中时有效 在
  • 在 Flutter 中迭代列表来渲染多个小部件?

    我有一个如下定义的字符串列表 var list one two three four 我想使用文本小部件在屏幕上并排呈现值 我尝试使用以下代码来尝试此操作 for var name in list return new Text name
  • 如何在 UIPickerView 标签旁边获得复选标记?

    The UIPickerView that appears in Safari has a check mark beside the current choice Is there a built in way to get this o
  • 如何在Android中的Webview中打开Excel、.doc文件?

    如何在 Android webview 中打开 Excel 和 doc 文件 谷歌文档可以支持吗 是的 Google doc 支持您显示 doc 或 excel pdf 文本或其他格式 WebView urlWebView WebView
  • 如何从 Android Google 令牌创建解析 _User 帐户?

    我发现了一些有用的信息片段 http blog parse com announcements bring your own login 向我展示如何登录 Android 应用程序once我有一个解析令牌 我可以成功获取手机 Google
  • 有关哈希盐的综合信息

    关于盐和最佳实践有很多问题 但大多数问题只是回答有关它们的非常具体的问题 我有几个相互关联的问题 假设数据库遭到破坏 每个用户的盐会阻止使用通用彩虹表来破解密码 必须为每个拥有唯一盐的用户生成一个单独的彩虹表才能获取其密码 这将是一个耗时的
  • 具有静态框架子依赖项的 XCFramework

    我有一个 XCFramework 它依赖于几个静态框架 我的 XCFramework 是在启用 BUILD FOR LIBRARIES FOR DISTRIBUTION 的情况下构建的 子框架不需要从 XCFramework 外部访问 当我
  • 将 Mercurial Repository 放在共享网络驱动器中是个好主意吗?

    我们是一个由 3 名开发人员组成的小团队 老板 我和另一名开发人员 主要是远程工作 我的任务是为 Mercurial HG 设置存储库服务器 看来我可以简单地将我们的集中存储库放在共享网络驱动器上 它的设置非常容易 但似乎存在我们任何人都可
  • 为什么预检请求仅在 Chrome 中失败,然后在尝试几次后就可以工作了?

    我在飞行前请求方面遇到了一个奇怪的问题 This is how it looks in the Chrome and other chromium based browsers after doing something in our ap
  • Spring Boot上传多部分413请求实体太大

    我有这样一个方法 RequestMapping method RequestMethod POST ResponseStatus HttpStatus CREATED ResponseBody PreAuthorize securitySe
  • Predicate 的基于 Linq 的通用替代方案?

    我有一个名为ICatalog如下所示 其中每个ICatalog有一个名称和一个方法 该方法将根据Predicate
  • 在 Bash 中提取最后两个斜杠之间的字符串

    我知道这可以使用正则表达式轻松完成 就像我回答的那样https stackoverflow com a 33379831 3962126 但是我需要在 bash 中执行此操作 所以我在 Stackoverflow 上发现的最接近的问题是这个
  • SetNeedsDisplay 不起作用

    我看到了许多与此问题相关的线程 但没有一个解决我的情况 我认为 我的情况应该很简单 我有一个自定义UIView在我的控制器中 从我的控制器中 我使用 self myView setNeedsDisplay 并且效果完美 当我尝试从内部调用它