whose view is not in the window hierarchy

本文介绍了一种在iOS开发中将presentViewController方法替换为自定义方法的技巧,通过循环找到顶层视图控制器并进行present操作。

直接把 presentViewController 方法替换为此方法即可

- (void)rootViewController:(UIViewController *) vc {
    UIViewController *topRootViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
    // 在这里加一个这个样式的循环
    while (topRootViewController.presentedViewController) {
        // 这里固定写法
        topRootViewController = topRootViewController.presentedViewController;
    }
    // 然后再进行present操作
    [topRootViewController presentViewController:vc animated:YES completion:nil];
}
在数据结构或程序逻辑中,如果检测到层次结构中存在循环(cycle detected in hierarchy structure),这通常意味着结构中的某些节点通过某种方式指向了其自身的祖先节点,从而形成一个闭合的路径。这种问题常见于树形结构、图结构或继承关系中。 ### 常见原因 1. **数据结构设计错误**:例如在树结构中,子节点错误地引用了其祖先节点,导致无法形成有效的有向无环图(DAG)。 2. **程序逻辑错误**:在遍历结构时,未能正确处理访问过的节点,导致无限循环或递归栈溢出。 3. **数据库设计问题**:例如在父子关系表中,外键约束允许形成循环引用。 4. **面向对象设计中的继承循环**:类A继承自类B,类B又继承自类A,造成循环依赖。 ### 检测与解决方法 1. **使用图算法检测循环**: - 对于图结构,可以使用深度优先搜索(DFS)或拓扑排序来检测是否存在循环。 - 示例代码(Python)使用DFS检测图中是否存在循环): ```python def has_cycle(graph, node, visited, rec_stack): visited[node] = True rec_stack[node] = True for neighbor in graph[node]: if not visited[neighbor]: if has_cycle(graph, neighbor, visited, rec_stack): return True elif rec_stack[neighbor]: return True rec_stack[node] = False return False def detect_cycle(graph): visited = {node: False for node in graph} rec_stack = {node: False for node in graph} for node in graph: if not visited[node]: if has_cycle(graph, node, visited, rec_stack): return True return False # 示例图 graph = { 'A': ['B'], 'B': ['C'], 'C': ['A'] } print(detect_cycle(graph)) # 输出: True ``` 2. **调试与日志**: - 在遍历过程中加入日志输出,记录已访问的节点,帮助识别循环的起点。 3. **数据验证与约束**: - 在数据库层面设置约束,防止插入会导致循环的数据。 4. **重构设计**: - 重新审视对象之间的关系,使用接口或组合代替继承,打破循环依赖。 ### 预防措施 - 在设计阶段进行严格的逻辑审查,确保结构为有向无环图(DAG)。 - 使用工具如UML建模工具或依赖分析工具辅助设计。 - 在关键操作中加入断言(assertion),确保不会访问到已处理的节点。 这些问题的处理需要结合具体的应用场景和系统环境进行分析。若涉及特定编程语言或框架,可进一步提供细节以便更精准地定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一行注释也不写

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值