在处理 Apple 的按需资源框架时,我的应用程序发现为一部分用户生成了许多异常。我解决这个问题的第一次尝试是将我的代码包装在 @try/@catch 块中,但不幸的是,崩溃仍然传播。我已经缩小了问题的范围,但不确定如何解决它。似乎 Apple 使用 NSBundleResourceRequest 的代码使用了 dispatch_once 块,在其中生成了 Obj-C 异常。我编写了以下测试代码来查看使用 dispatch_once 块进行异常处理的行为:
static dispatch_once_t onceToken;
@try {
// 1.) Expected: Caught by first catch block
// @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Couldn't find" userInfo:nil];
// 2.) Expected: Caught by second catch block
// @throw NSInternalInconsistencyException;
// 3.) Will not be caught be the surrounding @try/@catch block
dispatch_once(&onceToken, ^{
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Couldn't find" userInfo:nil];
});
} @catch(NSException* e) {
DDLogError(@"Catch: NSException");
} @catch(id e) {
DDLogError(@"Catch: Obj-C");
} @catch …Run Code Online (Sandbox Code Playgroud) 我有一个UITableView与一堆部分/行.我一直受到一个奇怪的错误的打击,当我删除一行时,我的程序会崩溃.我的删除代码如下:
[self.tableView beginUpdates];
NSMutableArray* myArray = [self.myArray mutableCopy];
[myArray removeObjectAtIndex:indexPath.row];
self.myArray = myArray;
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
Run Code Online (Sandbox Code Playgroud)
调试器在endUpdates出现以下错误时抛出错误.
*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'* - [__ NSArrayM insertObject:atIndex:]:object不能为nil'
现在,为了节省每个人一些时间,我已经进行了广泛的测试和验证,我的数据源更新和删除正确的indexPath,一切都是绝对正确的.我只是注意到只有当我一直滚动到我的tableview底部时才会出现问题,这样我就不能再滚动了,然后删除页面上可见区域中的一个单元格.
我可以在我的tableview中的任何其他位置正确删除,只要它下面有更多内容,但是一旦我在tableview的末尾,删除就会抛出此错误.
如果它有帮助,我基本上有一个UITableViewController(普通风格)UIPageViewController.我已经尝试删除UIPageViewController并只是推入UITableViewController,但仍然会发生此错误.
有谁知道我怎么能克服这个?
编辑:
似乎很多人仍然认为它可能是阵列,但这就是事情.我可以在我的tableview中移动我的部分(所有部分都有可以删除的行).当tableview完全滚动到底部时,我会在删除任何可见部分中的行时发生崩溃.这段代码片段被抽象并在所有部分中使用,所以我很确定代码是正确的.
当我删除tableview位于中间的部分中的一行时,我注意到该行向上滑动以删除,即使我说使用淡入淡出动画.动画为其下方的行或部分设置动画,这是正确的行为.我觉得这可能与tableview的内容结束时有关,它试图向上滚动,但没有任何东西.
HACK:
我刚刚实现的一个hack是在tableView.tableFooterView中放置一个与我的tableView相同大小的UIView.这会导致我的tableView具有更多可滚动的大小,我不喜欢这样,但是由于在删除最后一个单元格时有更多可滚动空间向上移动,所以不会发生崩溃.我很感激我无需这样做的解决方案.
好吧,如果页脚视图非常大,它似乎才有效.如果我使页脚视图更小,如100像素,如果滚动到tableview的边缘,它仍然会崩溃.
Stack Trace: (调试器将首先崩溃到上面代码中的endUpdates行,当我在调试器上再次播放两次时,此堆栈跟踪会出现)
2014-07-18 05:52:41.314 ScriptChart[26419:905949] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(
0 CoreFoundation 0x0000000109c9f055 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000010d1d8a1c objc_exception_throw + 45 …Run Code Online (Sandbox Code Playgroud) 我试图检索我的类或其任何子类定义的所有属性的列表.以下代码片段是我一直使用的代码,它一直正常工作,直到最近的iOS8 beta 4.
if(!dictionary) {
dictionary = [NSMutableDictionary dictionary];
// Get all properties we have until we hit CBLNestedModel
while(klass != [CBLNestedModel class]) {
unsigned count;
objc_property_t* properties = class_copyPropertyList(klass, &count);
for (unsigned i = 0; i < count; i++) {
objc_property_t property = properties[i];
const char* propertyNameC = property_getName(property);
NSString* propertyName = [NSString stringWithUTF8String:propertyNameC];
const char* propertyAttrC = property_getAttributes(property);
NSString* propertyAttrS = [NSString stringWithUTF8String:propertyAttrC];
NSArray* propertyAttr = [propertyAttrS componentsSeparatedByString:@","];
NSLog(@"%@ has property %@", NSStringFromClass(klass), propertyName);
dictionary[propertyName] = propertyAttr;
} …Run Code Online (Sandbox Code Playgroud) 有谁知道如何在 UISplitViewController 中反转主/细节视图控制器的显示?我基本上只想在屏幕的右侧而不是左侧显示主列表,但想要保留拆分视图控制器对主列表所做的所有操作(隐藏它并将其带回屏幕 - 只是希望它从右侧而不是左侧进行动画处理)。我看到 ios8 已经向 UISplitViewController 添加了一些急需的功能,但我不确定如何从中实现这一点。任何建议将不胜感激!
我有一个iPad应用程序,我想在我的视图控制器的分隔空间中显示UIWebView.我像iPhone一样制作了320px的宽度,并希望内容能够准确呈现iPhone上的内容.但是,我加载的任何页面仍然以完整的iPad大小呈现.

我已经尝试通过NSUserDefaults设置用户代理,虽然这有助于第一页,但是1.)点击链接后不起作用,如图1中所示.2.)像google一样呈现谷歌的网站略有不同是在iPhone Safari浏览器上加载谷歌.
NSString* userAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X)";
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent" : userAgent}];
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置缩放页面以适应UIWebView.scalesPageToFit,但这只是在窗口中缩放页面的iPad版本,使内容难以辨认.
我还尝试使用Javascript在加载后修复页面,但这也不起作用.它使谷歌等网站与你在iPhone Safari浏览器上加载谷歌的方式略有不同.
- (void)webViewDidFinishLoad:(UIWebView*)webView {
if(webView.frame.size.width < webView.window.frame.size.width) {
// width=device-width results in a wrong viewport dimension for webpages displayed in a popover
NSString *jsCmd = @"var viewport = document.querySelector('meta[name=viewport]');";
jsCmd = [jsCmd stringByAppendingFormat:@"viewport.setAttribute('content', 'width=%i, initial-scale=1.0, user-scalable=1');", (NSUInteger)webView.frame.size.width];
[webView stringByEvaluatingJavaScriptFromString:jsCmd];
}
// stop network indicator
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
Run Code Online (Sandbox Code Playgroud)

而不是像我在iPhone 5S上的这样渲染:

任何帮助我如何在iPad上实现iPhone风格的UIWebView将不胜感激!谢谢!
编辑:
我尝试将缩放系数设置为仅适用于iPad的宽度,但它只会使整个iPad版本的页面符合宽度,并且内容难以辨认.仍然不像上面的iPhone.
- …Run Code Online (Sandbox Code Playgroud) 我的文本中可能包含圆括号、方括号以及具有相同文本的子字符串。如何通过正则表达式使这些文本匹配,但不区分大小写?
NSError* error = nil;
NSString* text = @"Hello (extreme elevation) - some longer string";
NSString* obj = @"hello (extreme elevation)";
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:obj
options:NSRegularExpressionCaseInsensitive
error:&error];
NSArray* matches = [regex matchesInString:text
options:0
range:NSMakeRange(0, text.length)];
Run Code Online (Sandbox Code Playgroud)
这不匹配任何内容,即使 Obj 将 hello 大写,它也不会通过正则表达式匹配,但会通过 NSString rangeOfString 匹配。我希望能够在这种情况下将 obj 与文本匹配,以及其他可能有括号的情况,例如:
NSString* text = @"Hello [extreme elevation]";
NSString* obj = @"hello [extreme elevation]";
Run Code Online (Sandbox Code Playgroud) ios ×5
ios8 ×3
ios7 ×2
ipad ×1
nsobject ×1
objective-c ×1
regex ×1
uitableview ×1
uiwebview ×1