在这篇文章中,我们将带领您了解XcodeSwiftMacOs-在没有StoryBoard和ViewController的情况下隐藏/显示窗口的全貌,同时,我们还将为您介绍有关Appdelegate跳转
在这篇文章中,我们将带领您了解Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口的全貌,同时,我们还将为您介绍有关Appdelegate 跳转其他页面 获取当前屏幕显示的 viewcontroller 获取当前屏幕中 present 出来的 viewcontroller 获取当前导航控制器、IDA Pro 权威指南学习笔记 (七) - 其他 IDA 显示窗口、IDA Pro 权威指南学习笔记(六) - 次要的 IDA 显示窗口、iOS Xcode11 新建项目删除 ViewController,Storyboard,SceneDelegate的知识,以帮助您更好地理解这个主题。
本文目录一览:- Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口
- Appdelegate 跳转其他页面 获取当前屏幕显示的 viewcontroller 获取当前屏幕中 present 出来的 viewcontroller 获取当前导航控制器
- IDA Pro 权威指南学习笔记 (七) - 其他 IDA 显示窗口
- IDA Pro 权威指南学习笔记(六) - 次要的 IDA 显示窗口
- iOS Xcode11 新建项目删除 ViewController,Storyboard,SceneDelegate
Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口
如何解决Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口
我正在我的 Apple macOS 计算机上使用 Swift 3 制作应用
通过单击按钮并调用函数 w
cloSEOtherw()
的主窗口中关闭一个窗口是 eazy [以这种方式]
@IBOutlet var w: NSWindow!
@IBOutlet var otherw: NSWindow!
@IBOutlet var otherw: NSPanel!
@IBAction func cloSEOtherw(_ sender: AnyObject) {
otherw.close()
}
但是如何重新打开它 [otherwin]?
我也尝试了各种方法,也喜欢w.isHidden = true
,但没有结果。
我没有 StoryBoard
,也没有 ViewController
。
我从AppDelegate
开始做所有事情。
解决方法
方法是: otherw.orderFront(self)
还有:
makeKeyAndOrderFront 再次显示。
您可以使用 otherw.orderOut(self)
代替 otherw.close()
感谢@Willeke
参考: How to hide the window
好好学习!
Appdelegate 跳转其他页面 获取当前屏幕显示的 viewcontroller 获取当前屏幕中 present 出来的 viewcontroller 获取当前导航控制器
Appdelegate 跳转其他页面
UITabBarController *tab = (UITabBarController *)_window.rootViewController;
UINavigationController *nav = tab.viewControllers[tab.selectedIndex];
MessageViewController *vc = [[MessageViewController alloc] init]; 需要跳转的页面
vc.hidesBottomBarWhenPushed = YES;
[nav pushViewController:vc animated:YES];
// 获取当前屏幕显示的 viewcontroller
- (UIViewController *)getCurrentVC{
UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
if (!window) {
return nil;
}
UIView *tempView;
for (UIView *subview in window.subviews) {
if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) {
tempView = subview;
break;
}
}
if (!tempView) {
tempView = [window.subviews lastObject];
}
id nextResponder = [tempView nextResponder];
while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) {
tempView = [tempView.subviews firstObject];
if (!tempView) {
return nil;
}
nextResponder = [tempView nextResponder];
}
return (UIViewController *)nextResponder;
}
// 获取当前屏幕中 present 出来的 viewcontroller。
- (UIViewController *)getPresentedViewController
{
UIViewController *appRootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
UIViewController *topVC = appRootVC;
if (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}
return topVC;
}
// 获取当前导航控制器
- (BaseNavigationController *)getNavController{
BaseTableBarControllerView *tabVC = (BaseTableBarControllerView *)self.window.rootViewController;
tabVC.selectedIndex = 2;
BaseNavigationController *pushClassStance = (BaseNavigationController *)tabVC.selectedViewController;
return pushClassStance;
}
IDA Pro 权威指南学习笔记 (七) - 其他 IDA 显示窗口
默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开
Strings 窗口 (Strings)
Strings 窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址
双击 Strings 窗口中的任何字符串,反汇编窗口和十六进制窗口将跳转到该字符串所在的地址
将 Strings 窗口与交叉引用相结合,可迅速定位感兴趣的字符串,并追踪到程序中任何引用该字符串的位置
例如,看到 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 这个字符串,并想知道应用程序为什么会引用这个特殊的 Windows 注册表项
每次打开 Strings 窗口,IDA 都会扫描或重新扫描整个数据库,查找其中的字符串
扫描字符串的操作遵照 Strings 窗口的设置来完成,右击该窗口,在出现的菜单中选择 Setup,即可开始设置
Setup Strings 窗口用于指定 IDA 应扫描的字符串类型
IDA 默认扫描的字符串类型为至少包含 5 个字符的 C 风格、以 null 结尾的 7 位 ASCII 字符串
每次单击 OK 按钮关闭 Setup Strings 窗口后,IDA 都会根据新的设置重新扫描数据库,查找相应的字符串
Display only defined strings(仅显示已定义的字符串),这个选项使 Strings 窗口仅显示 IDA 自动创建或用户手动创建的已命名字符串数据项
在选中这个选项的同时禁用所有其他选项,IDA 将不会自动扫描其他类型的字符串
Ignore instructions/data definitions(忽略指令 / 数据定义),这个选项会使 IDA 扫描指令和现有数据定义中的字符串
使用这个选项,可以让 IDA 扫描二进制代码中错误地转换成指令的字符串,或扫描数据中非字符串格式(如字节数组或整数)的字符串
这个选项还会导致 IDA 生成许多垃圾字符串,即那些由 5 个或更多 ASCII 字符构成的字符串(无论其是否合法)
使用这个选项的效果类似于使用 strings -a 命令
Names 窗口 (Names)
Names 窗口简要列举了一个二进制文件的所有全局名称
名称是指对一个程序虚拟地址的符号描述
名称可以按字母排序,也可以按虚拟地址排序(升序或降序)
双击 Names 窗口中的名称,可跳转到显示该名称的反汇编视图
Names 窗口中显示的名称采用了颜色和字母编码:
f 为常规函数,IDA 认为这些函数不属于库函数
i 为导入的名称,通常为共享库导入的函数名称
它与库函数的区别在于:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示
D 为数据,已命名数据的位置通常表示全局变量
C 为命名代码,这些是已命名的程序指令位置,IDA 认为它们不属于任何函数
当 IDA 在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况
A 为字符串数据,这是一个被引用的数据位置,其中包含的一串字符符合 IDA 的某种已知的字符串数据类型,如以 ''\0'' 字节结束的 ASCII 字符串
在对一个程序进行反汇编的过程中,IDA 会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称
如果一个位置已在程序符号表中命名,IDA 将采用该名称
如果符号表中某一程序位置没有名称,则 IDA 会生成一个默认的名称,以在反汇编过程中使用
在 IDA 给某个位置命名时,它会使用该位置的虚拟地址和一个表示该位置的类型的前缀进行命名
将虚拟地址合并到生成的名称中,可确保生成的所有名称的唯一性,因为没有两个位置的虚拟地址是相同的,这种自动生成的名称并不在 Names 窗口中显示
用于自动生成名称的一些常用前缀:
sub_xxxxxx:地址 xxxxxx 处的子例程
loc_xxxxxx:地址 xxxxxx 处的一个指令
byte_xxxxxx:位置 xxxxxx 处的 8 位数据
word_xxxxxx:位置 xxxxxx 处的 16 位数据
dword_xxxxxx:位置 xxxxxx 处的 32 位数据
unk_xxxxxx:位置 xxxxxx 处的大小未知的数据
段窗口 (Segments)
段窗口显示的是在二进制文件中出现的段的简要列表
在讨论二进制文件的结构时,IDA 术语段(segment)常称为节(section)
段窗口中显示的信息包括段名称、起始和结束地址以及许可标志
起始和结束地址代表程序段在运行时对应的虚拟地址范围
双击段窗口中的任何条目,IDA 将跳转到反汇编窗口中该段的起始位置
右击一个条目,IDA 将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性
段窗口所对应的命令行工具包括 objdump (-h) 、 readelf (-s) 和 dumpbin (/HEADERS)
签名窗口 (Signatures)
签名窗口显示的是 IDA 对打开的二进制文件所使用的签名
签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器
签名还可用于将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数
IDA 对该二进制文件应用了 vcseh 签名(来自 <IDADIR>/sigs 目录),并在这个过程中将 0 个函数识别为库函数
至少在两种情况下,需要知道如何对二进制文件应用其他签名:
第一种情况:IDA 无法识别用于构建二进制文件的编译器,因而无法选择所需的相应签名
这时,需要根据自己的初步分析,确认 IDA 应尝试使用的签名,并迫使 IDA 使用一个或几个签名
第二种情况:IDA 中没有针对某些库的现成签名,这时需要自己为这些库创建你自己的签名
类型库窗口 (Type libraries)
类型库保存 IDA 积累的一些信息,即 IDA 从最常用的编译器的头文件中搜集到的有关预定义数据类型和函数原型的信息
通过处理头文件,IDA 可确定常用库函数所需的数据类型,并为反汇编代码提供相应的注释
IDA 还可从这些头文件中了解复杂数据结构的大小和布局所有这些信息都收集在 TIL 文件(<IDADIR/til 目录>)中,并可在任何时候应用于分析的二进制文件
与应用签名时一样,在选择加载一组适当的 TIL 文件之前,IDA 必须首先确定一个程序所使用的库
要请求 IDA 加载其他类型库,可以在类型库窗口中按下 INSERT 键,或右击窗口并在出现的菜单中选择 Load Type Library(加载类型库)
函数调用窗口 (Function calls)
如果 Y 函数直接调用 X 函数,或者 X 函数直接调用 Y 函数,则称 Y 函数是 X 函数的近邻
打开函数调用窗口时,IDA 会确定光标所在位置的函数的 “近邻”
函数 ___pow5mult_D2A 被 ___gdtoa 从 3 个不同的位置调用,被 ___strtodg 从 2 个不同的位置调用,而这个函数又调用了另外 9 个函数
双击函数调用窗口中的任何一行,IDA 将跳转到反汇编窗口中对应的调用或被调用函数(即调用方或被调用方)
IDA 交叉引用(xrefs)是用于生成函数调用窗口的机制
问题窗口 (Problems)
IDA 在问题窗口中显示它在反汇编二进制文件时遇到的困难,以及它如何处理这些困难
每个问题都注明了问题发生的地址、问题的类型以及问题所在位置的指令
在上图中,有一个 NODISASM 问题和一个 DECISION 问题
DECISION 问题通常表示 IDA 决定将一个地址上的字节作为指令而非数据进行反汇编,即使这个地址在递归下降指令遍历过程中从未被引用也是如此
IDA Pro 权威指南学习笔记(六) - 次要的 IDA 显示窗口
十六进制窗口
IDA 十六进制窗口可以配置为显示各种格式,并可作为十六进制编辑器使用
默认情况下,十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示 16 个字节,以及其对应的 ASCII 字符
和在反汇编窗口中一样,用户也可以同时打开几个十六进制窗口
第一个十六进制窗口叫做 Hex View-A,第二个十六进制窗口叫做 Hex View-B,接下来的窗口叫做 Hex View-C,依次类推
默认情况下,第一个十六进制窗口会与第一个反汇编窗口同步
如果一个反汇编窗口与一个十六进制窗口同步,在一个窗口中滚动鼠标,另一个窗口也会滚动到相同的位置(同一个虚拟地址)
如果在反汇编窗口中选中一个项目,十六进制窗口中的对应字节也将突出显示
在反汇编窗口中,光标指向地址 0040E60D,这是一个 mov 指令,在十六进制窗口中,构成这个指令的全部 3 个字节均突出显示
右击十六进制窗口的任何位置,出现十六进制窗口的上下文菜单
使用这个菜单,可以指定与某个特殊的十六进制窗口同步的反汇编窗口(如果有的话)
如果取消选中同步选项,那么在滚动十六进制窗口时,将不会有任何反汇编窗口随之滚动
择 Edit 菜单项可将十六进制窗口转变为十六进制编辑器,完成编辑后,你必须提交或取消更改才能返回查看模式
可以使用 Data Format 菜单项选择各种显示格式,如 1、2、4、8 字节十六进制,带签名的十进制或不带签名的十进制整数及各种浮点格式
可以使用 Columns 菜单项更改显示的列数
使用 Text 选项打开或关闭文本块
如果十六进制窗口中显示的是问号,这表示 IDA 无法识别给定的虚拟地址范围内的值,如果程序中包含一个 bss 节,就会出现这种情况
通常,bss 节并不占用文件的空间,但加载器会扩展这一节,以适应程序的静态存储要求
bss 节由编译器创建,用于保存程序的所有未初始化的静态变量
既然没有为这些变量指定初始值,就没有必要在程序的文件镜像中为它们分配空间,只需在程序的一个头文件中注明它的大小
当程序执行时,加载器会为其分配所需的空间,并将整个数据块的初始值设为 0
导出窗口
导出窗口列出文件的入口点
这些入口点包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量
通常,用户可在共享库(如 Windows DLL 文件)中找到导出的函数
导出的项目按名称、虚拟地址和序数(如果可用)排列
共享库可能会使用导出序数,以方便用户通过序数而非名称访问函数
使用序数可以加快地址查询速度,并允许程序员隐藏函数的名称
Windows DLL 即使用导出序数
对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点,IDA 将这个入口点取名为 start
与许多其他 IDA 窗口一样,双击导出窗口中的一个条目,IDA 将会跳转到反汇编窗口中与该项目有关的地址
导出窗口提供与 objdump (-T) 、 readelf (-s) 和 dumpbin (/EXPORTS) 等命令行工具类似的功能
导入窗口
导入窗口的功能与导出窗口的功能正好相反
导入窗口列出由被分析的二进制文件导入的所有函数
只有在二进制文件使用共享库时,IDA 才需要用到导入窗口
静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容
导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称
由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址
双击第一个条目,IDA 将跳转到反汇编窗口的 00412168 地址处
在十六进制窗口中,这个内存位置的内容显示为 ?? ?? ?? ??
因为 IDA 是一种静态分析工具,它无法获知程序在执行时会在这个内存位置输入什么地址
导入窗口还提供与 objdump (-T) 、 readelf (-s) 和 dumpbin (/IMPORTS) 等命令行工具类似的功能
导入窗口仅显示二进制文件想要动态加载器自动处理的符号,二进制文件选择使用 dlopen/dlsym 或 LoadLibrary/GetProcAddress 等机制自行加载的符号将不会在导入窗口中显示
结构体窗口
结构体窗口用于显示 IDA 决定在一个二进制文件中使用的任何复杂的数据结构(如 C 结构体和联合)的布局
在分析阶段,IDA 会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来
双击数据结构的名称,IDA 将展开该结构,这样你就可以查看该结构的详细布局,包括每个字段的名称和大小
结构体窗口的两个主要用途包括:
为标准数据结构的布局提供现成的参考;
提供一种方法,在发现程序使用的自定义数据结构时,帮助创建自己的、可用作内存布局模板的数据结构
枚举窗口
如果 IDA 检测到标准枚举数据类型(C enum ),它将在枚举窗口中列出该数据类型
可以使用枚举来代替整数常量,提高反汇编代码的可读性
在枚举窗口中也可以定义自己的枚举类型,并将其用在经过反汇编的二进制代码中
iOS Xcode11 新建项目删除 ViewController,Storyboard,SceneDelegate
一。删除 ViewController,Storyboard
1:直接删除 Storyboard 和 ViewController, 不是删索引,是直接移除;2:info 中的 plist 文件删除 Main storyboard file base name
选项; 3:在 appdelegaet
中重新创建 window
, 然后将自己的视图设为根视图然后让 gaiwindow
现实出来即可。
二。删除 SceneDelegate
1: 到 info.plist
删除 Application Scene Manifest
选项; 2: 删掉 Scenedelegate.h 和 Scenedelegate.m 这两个文件;3: 删掉 - (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {}
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {}
4: 在 APPdelegate.h 里面添加 window 属性 @property (strong, nonatomic) UIWindow * window;
5: 在 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
里面添加
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
// ViewController 是你的 rootViewController
self.window.rootViewController = [[ViewController alloc]init];
[self.window makeKeyAndVisible];
关于Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Appdelegate 跳转其他页面 获取当前屏幕显示的 viewcontroller 获取当前屏幕中 present 出来的 viewcontroller 获取当前导航控制器、IDA Pro 权威指南学习笔记 (七) - 其他 IDA 显示窗口、IDA Pro 权威指南学习笔记(六) - 次要的 IDA 显示窗口、iOS Xcode11 新建项目删除 ViewController,Storyboard,SceneDelegate的相关知识,请在本站寻找。
本文标签: