这是我在开发过程中遇到的一些问题的整理,会定期做更新,希望对大家有所帮助^_^
问题1:UITextField和UITextView中长按出来的放大镜无法正常显示内容
现象:
如果在新建的UIWindow下添加UITextField或者UITextView后,长按此控件弹出来的放大镜不是显示当前文本的放大模式,而是显示了底层的Window的内容。
环境:
iOS7+ 真机/模拟器
分析:
由于Window的层次导致,默认的windowLevel是1。如果层次相同则会导致显示不正常。
解决:
创建新的UIWindow时将windowLevel调高一个层次则可解决问题。如:
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
_window.windowLevel = UIWindowLevelNormal + 1;
问题2:Error Domain=GKErrorDomain Code=15 "无法完成所请求的操作
现象:
真机调试使用GameCenter进行用户授权会报告错误: Error Domain=GKErrorDomain Code=15 "无法完成所请求的操作,因为 Game Center 未识别此应用程序。"
环境:
iOS8 真机
分析:
有可能是几种情况导致:
- 应用的BundleID与ItunesConnect上配置的BundleID不匹配。
- iOS设备中的GameCenter没有开启沙盒模式。
解决:
- 登陆itunesConnect。检查App中设置的BundleID,如果发现和工程中的BundleID不一致,请修改工程中的BundleID。
- 进入设备的设置 -> Game Center。查看“开发者”一栏下面的沙盒的开关是否开启,如果没有开启点击打开。
问题3:使用UIWebView加载JS脚本时如果调用alert会卡住界面
现象:
使用UIWebView的 stringByEvaluatingJavaScriptFromString方法时,在被执行的JS方法中不能有alert出现,否则可能会导致主线程阻塞。如:
OC中:
[webView stringByEvaluatingJavaScriptFromString:@“demo();"];
JS中:
demo ()
{
alert(“test”);
}
解决方法:
如果确实需要alert,则使用setTimeout方法执行。JS修改如下:
demo ()
{
setTimeout (function () {
alert(“test”);
}, 100);
}
问题4:CoreData无法移除Relationships的关联对象
现象:
当实体A与实体B之间是一对多关系时,为实体A添加一个Relationship关联实体B。当从实体A移除实体B的关系时,即使保存成功也无法正真移除与实体B的关联关系。
解决方法:
为实体B提供一个逆向Relationship关联到实体A后,移除关系功能正常。
问题5:[UIApplication sharedApplication].keyWIndow丢失
现象:
弹出一个新建的UIWindow作为keyWindow显示界面后,在释放该Window后,再次获取keyWindow返回nil。代码如下:
//显示Window
- (void)showWindow
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[UIViewController alloc] init];
[self.window makeKeyAndVisible];
}
//关闭Window
- (void)closeWindow
{
self.window = nil;
}
环境:
iOS 9
解决:
UIWindow及其子类如果为keyWindow,则必须在dealloc之前调用resignKeyWindow,否则会导致key window丢失。则上面代码可以改为:
- (void)showWindow
{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[UIViewController alloc] init];
[self.window makeKeyAndVisible];
}
- (void)closeWindow
{
[self.window resignKeyWindow];
self.window = nil;
}
问题6:the application could not be verified
现象:
使用XCode运行调试App时,弹出提示框提示“the application could not be verified”。无法运行应用。
解决:
由于项目的Bundle Identifier包含非法字符串导致(可能包含中文)。修改此项为英文字符即可。
问题7:Could not launch “xxxxxx”
现象:
真机调试出现:“process launch failed: failed to get the task for process 3835”
原因:
打包证书使用了发布证书导致。
解决方法:
在project的build settings -> Code Signing -> Code Signing Identity中修改调试用的开发者证书即可.