- (void)viewWillLayoutSubviews {
//为什么要在这里调用一次alert 是因为 presentViewController 方法必须在页面加载完成之后才会加载 否则会报错不能弹出 因为xib的viewDidLoad的时候并未加载完成
//Warning: Attempt to present on whose view is not in the window hierarchy!
//记录一下知识点 xib的生命周期与storyboard、纯代码 是不一样的 在vc生命周期的方法中打印vc的view尺寸的变化,可以看到viewDidLoad到viewWillAppear:中view的size都是xib的大小,到viewDidAppear的方法中才将view的大小按照模拟器的屏幕尺寸改回来 但是将布局代码放在viewDidAppear中也不好 所以可以在这个方法中进行布局 这个方法类似UIView的layoutSubviews 控制器加载完view后会再调用
//viewDidLoad、viewWillAppear、viewWillLayoutSubviews、viewDidLayoutSubviews、viewDidAppear 分别打印出self.view.frame 查看 可以明确的看到 viewDidLoad、viewWillAppear中加载的 frame是xib中的frame 到viewWillLayoutSubviews开始 加载的是 屏幕尺寸的frame
//所以针对当前的这个需求 可以理解为 在viewDidLoad的时候 虽然viewDidLoad方法已经执行了 但是xib文件还没有加载完成 到viewWillLayoutSubviews方法 xib加载完成 这时候presentViewController就可以执行了 纯代码布局的vc中不会出现这个问题
Reachability *curReach = [Reachability reachabilityWithHostName:@"www.apple.com"];
if ([curReach currentReachabilityStatus] == NotReachable) {
[self showNoNetworkAlert];
}
}
- (void) showNoNetworkAlert {
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"啦啦啦啦啦啦" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"重试" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self validateAndDownloadClientPack];
}];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
}
源码在 DBBMoBo中 DBBLaunchViewController.m
连上手机,选择windows-》devices,选中设备,在右边选择你的APP,下方的设置按钮有download container
然后下载文件,显示包内容,即是沙盒内的文件。
在真机上, 不能move bundle中的文件到document目录下 ,但是 copy 可以, 可以copy bundle中的文件到 document。
WKWebview不支持 NSURLProtocol ,添加了一个类 : NSURLProtocol+WebKitSupport 使用了私有API github上有
WKWebview 禁止缩放
self.wkWebView.scrollView.delegate = self;
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return nil;
}
NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
NSLog(@"%@",errResponse);
(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
//重点 设置frame时需要这样设置,如果直接设置self.view.frame 时是无法自适应屏幕的
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0,
0,
ISScreen_Width,
ISScreen_Height)];
NSURL * webURL = [NSURL URLWithString:self.needOpenURL];
NSURLRequest * webRequest = [NSURLRequest requestWithURL:webURL];
[webView loadRequest:webRequest];
[self.view addSubview:webView];
//滑动返回看这里
webView.allowsBackForwardNavigationGestures = NO;
//重点(当然需要遵守协议,不然会有警告)(当然遵守了这个你就可以侧滑返回上个页面了)
webView.navigationDelegate = self;
}
使用个人开发者账号 真机调试的时候 报错 说
Set the provisioning profile value to "Automatic" in the build settings editor,
意思说 provisioning profile的设置不正确 应该设置成Automatic
可是设置成了 Automatic 还是不行 报一样的 错
问题在于 在Build Setting中的User-Defined中 有一个
PROVISIONING_PROFILE 注意是 大写的 把这个中的设置 全部清空就可以了
抽屉的效果 侧边栏加拖动手势 最左侧 在屏幕外加一个tableview
拖动的时候 加上动画效果 让左侧的tableview改变frame 让原本页面的tableview也改变frame 从右边滑出去 然后可以在拖动的时候 给原本的tableview加一个渐变色的灰色图层 到滑动到停止后 灰色图层上添加一个单击手势 点击 就再用动画 弹回去 如果添加外部的按钮控制 也是一样 在动画中 添加两个改变frame 和 添加渐变色图层的方法 动画完成 添加单击手势 简单
General里Display Name改了之后 需要卸载安装才生效
InfoPlist.strings里的CFBundleDisplayName改了以后 即时生效
在集合类对象中,对 immutable 对象进行 copy,是指针复制, mutableCopy 是内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制
就是说,对可变类型来说,无论copy还是mutableCopy,都是进行深复制也就是内容复制,那么例子里面
self.array = [mutableArray copy]; 是深复制,复制了内容,开辟新内存
self.array = mutableArray; 是浅复制,只复制指针,不占用新内存