草庐IT

iOS 9 - 缺少 UI 元素

coder 2024-01-12 原文

我正在开发一个使用 UITextField 子类(我们称之为 CustomTextField)的旧应用程序,它使用 xibs/storyboards 在 iOS 8.4 中显示。但是,在 iOS 9 的三个 View 中,有两个 View 的 UI 层次结构中缺少它。

  • 成功案例:xib。没有使用过渡。
  • 第一个失败案例:UITableViewCell 子类具有通过 Storyboard连接的 CustomTextField socket 。 TableView 的 View Controller 是用 instantiateViewControllerWithIdentifier: 实例化的。它的 tableView:cellForRowAtIndexPath: 方法返回一个非零单元格,但 CustomTextField 与自定义单元格的其他元素(开关、 ImageView 和标签)一起丢失。

  • 第二个失败案例:在主视图 Controller 的 viewDidLoad 中,使用类别方法 loadInstanceFromNib 通过 xib 添加了 CustomTextField 及其父 View ,但 CustomTextField 是UI 层次结构中缺少:

    + (id)loadInstanceFromNib    
    {
       UIView *result;
    
       NSArray* elements = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil];
    
       for (id anObject in elements) {
           if ([anObject isKindOfClass:[self class]]) {
               result = anObject;
               break;
           }
       }
    
       return result;
    }
    

我在 CustomTextField.m 中放置了几个断点。在 iOS 9 和 8.4 中,调用了 awakeFromNib。但是,willMoveToSuperview 仅在 8.4 中针对两种失败情况调用。这是 willMoveToSuperView 的回溯:

* thread #1: tid = 0xde22fd, 0x00088ca9 Shop`-[CustomTextField willMoveToSuperview:](self=0x7be75690, _cmd=0x02115c1c, newSuperview=0x7be75160) + 57 at CustomTextField.m:39, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x00088ca9 Shop`-[CustomTextField willMoveToSuperview:](self=0x7be75690, _cmd=0x02115c1c, newSuperview=0x7be75160) + 57 at CustomTextField.m:39
    frame #1: 0x0188be77 UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 622
    frame #2: 0x0187e976 UIKit`-[UIView(Hierarchy) addSubview:] + 56
    frame #3: 0x0186d87e UIKit`-[UIView _setTraitStorageSubviews:] + 647
    frame #4: 0x010ca608 Foundation`_NSSetUsingKeyValueSetter + 115
    frame #5: 0x010ca58d Foundation`-[NSObject(NSKeyValueCoding) setValue:forKey:] + 267
    frame #6: 0x0188f13f UIKit`-[UIView(CALayerDelegate) setValue:forKey:] + 168
    frame #7: 0x01100016 Foundation`-[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 386
    frame #8: 0x01ab4d0e UIKit`-[_UIRelationshipTraitStorage applyRecordsMatchingTraitCollection:] + 1256
    frame #9: 0x01ab3a89 UIKit`-[NSObject(_UITraitStorageAccessors) _applyTraitStorageRecordsForTraitCollection:] + 202
    frame #10: 0x01871f84 UIKit`-[UIView _traitCollectionDidChangeFromOldCollection:toNewCollection:scaleDidChange:] + 62
    frame #11: 0x0187207f UIKit`-[UIView _wrappedProcessDidChangeRecursivelyFromOldTraits:toCurrentTraits:scaleDidChange:forceNotification:] + 186
    frame #12: 0x0187215e UIKit`-[UIView _wrappedProcessDidChangeRecursivelyFromOldTraits:toCurrentTraits:scaleDidChange:forceNotification:] + 409
    frame #13: 0x0187232c UIKit`__86-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:]_block_invoke + 69
    frame #14: 0x01f75040 UIKit`-[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 134
    frame #15: 0x018722df UIKit`-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:] + 295
    frame #16: 0x01880773 UIKit`__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 446
    frame #17: 0x018805ad UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] + 458
    frame #18: 0x0188c41d UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 2068
    frame #19: 0x0187e976 UIKit`-[UIView(Hierarchy) addSubview:] + 56
    frame #20: 0x0186d87e UIKit`-[UIView _setTraitStorageSubviews:] + 647
    frame #21: 0x010ca608 Foundation`_NSSetUsingKeyValueSetter + 115
    frame #22: 0x010ca58d Foundation`-[NSObject(NSKeyValueCoding) setValue:forKey:] + 267
    frame #23: 0x0188f13f UIKit`-[UIView(CALayerDelegate) setValue:forKey:] + 168
    frame #24: 0x01100016 Foundation`-[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 386
    frame #25: 0x01ab4d0e UIKit`-[_UIRelationshipTraitStorage applyRecordsMatchingTraitCollection:] + 1256
    frame #26: 0x01ab3a89 UIKit`-[NSObject(_UITraitStorageAccessors) _applyTraitStorageRecordsForTraitCollection:] + 202
    frame #27: 0x01871f84 UIKit`-[UIView _traitCollectionDidChangeFromOldCollection:toNewCollection:scaleDidChange:] + 62
    frame #28: 0x0187207f UIKit`-[UIView _wrappedProcessDidChangeRecursivelyFromOldTraits:toCurrentTraits:scaleDidChange:forceNotification:] + 186
    frame #29: 0x0187232c UIKit`__86-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:]_block_invoke + 69
    frame #30: 0x01f75040 UIKit`-[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 134
    frame #31: 0x018722df UIKit`-[UIView _processDidChangeRecursivelyFromOldTraits:toCurrentTraits:forceNotification:] + 295
    frame #32: 0x0188f503 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 629
    frame #33: 0x02c84771 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
    frame #34: 0x01614e47 QuartzCore`-[CALayer layoutSublayers] + 144
    frame #35: 0x01608925 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 403
    frame #36: 0x016172de QuartzCore`-[CALayer(CALayerPrivate) layoutBelowIfNeeded] + 44
    frame #37: 0x01880f08 UIKit`-[UIView(Hierarchy) layoutBelowIfNeeded] + 738
    frame #38: 0x01880c11 UIKit`-[UIView(Hierarchy) layoutIfNeeded] + 83
    frame #39: 0x01998bc5 UIKit`-[UINavigationController _layoutViewController:] + 1154
    frame #40: 0x01997d41 UIKit`-[UINavigationController _layoutTopViewController] + 261
    frame #41: 0x0199559a UIKit`-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 584
    frame #42: 0x01be54b4 UIKit`-[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] + 334
    frame #43: 0x01be57c3 UIKit`-[UINavigationTransitionView _cleanupTransition] + 713
    frame #44: 0x01be5810 UIKit`-[UINavigationTransitionView _navigationTransitionDidStop] + 55
    frame #45: 0x0186a162 UIKit`-[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 206
    frame #46: 0x0186803d UIKit`+[UIViewAnimationState popAnimationState] + 334
    frame #47: 0x018834f4 UIKit`+[UIView(Animation) commitAnimations] + 36
    frame #48: 0x01be52b3 UIKit`-[UINavigationTransitionView transition:fromView:toView:] + 2798
    frame #49: 0x01be47bc UIKit`-[UINavigationTransitionView transition:toView:] + 56
    frame #50: 0x019999b9 UIKit`-[UINavigationController _startTransition:fromViewController:toViewController:] + 3123
    frame #51: 0x01999d85 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 669
    frame #52: 0x0199aa01 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
    frame #53: 0x01b14700 UIKit`-[UILayoutContainerView layoutSubviews] + 213
    frame #54: 0x0188f52a UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 668
    frame #55: 0x02c84771 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
    frame #56: 0x01614e47 QuartzCore`-[CALayer layoutSublayers] + 144
    frame #57: 0x01608925 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 403
    frame #58: 0x0160877a QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26
    frame #59: 0x01564c22 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 284
    frame #60: 0x015660b5 QuartzCore`CA::Transaction::commit() + 487
    frame #61: 0x0162e84d QuartzCore`+[CATransaction flush] + 52
    frame #62: 0x017f9a66 UIKit`-[UIApplication _reportMainSceneUpdateFinished:] + 39
    frame #63: 0x017fa9d9 UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 3182
    frame #64: 0x018138ee UIKit`__84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59
    frame #65: 0x017f8ffa UIKit`-[UIApplication workspaceDidEndTransaction:] + 155
    frame #66: 0x06ccfc9e FrontBoardServices`__37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71
    frame #67: 0x06ccf72f FrontBoardServices`__40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54
    frame #68: 0x06ce1d7c FrontBoardServices`__31-[FBSSerialQueue performAsync:]_block_invoke_2 + 30
    frame #69: 0x032fe050 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
    frame #70: 0x032f3963 CoreFoundation`__CFRunLoopDoBlocks + 195
    frame #71: 0x032f37bb CoreFoundation`__CFRunLoopRun + 2715
    frame #72: 0x032f2a5b CoreFoundation`CFRunLoopRunSpecific + 443
    frame #73: 0x032f288b CoreFoundation`CFRunLoopRunInMode + 123
    frame #74: 0x017f89b2 UIKit`-[UIApplication _run] + 571
    frame #75: 0x017fc0b6 UIKit`UIApplicationMain + 1526
    frame #76: 0x00097bba Shop`main(argc=1, argv=0xbffb45f4) + 138 at main.m:14
    frame #77: 0x03d7fac9 libdyld.dylib`start + 1

似乎 addSubview: 在 iOS 9 中从未被调用过,但为什么呢?

最佳答案

在 Storyboard 中禁用大小类可恢复所有丢失的 subview 。

https://forums.developer.apple.com/thread/14003

关于iOS 9 - 缺少 UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315704/

有关iOS 9 - 缺少 UI 元素的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  9. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐