2012-10-22 21 views
2

我試圖打印應用程序的可見和隱藏窗口的視圖層次結構。這裏是MFMessageComposeViewController的一個子類中,我的代碼的一部分:iOS 6.0上的MFMessageComposeController中的UIButton爲零

NSArray *windows = [[UIApplication sharedApplication] windows]; 

for(UIWindow *aWindow in windows) { 
    if([aWindow isMemberOfClass:NSClassFromString(@"UITextEffectsWindow")]) { 
     sendButton = [self findButtonInView:aWindow]; 
      break; 
    } 
} 

的findButtonInView:方法是在當前的UIWindow遞歸搜索一個UIButton。

這是工作正常與iOS4.3和iOS 5.1(預期的UIButton找到成功),但不適用於iOS6。 以下是視圖層次打印來自兩個測試的結果:

的iOS 4.3:

<UITextEffectsWindow: 0x1e32a0; frame = (0 0; 320 480); opaque = NO; layer = <CALayer: 0x1e33d0>> 
    | <UIPeripheralHostView: 0x1e4a80; frame = (0 224; 320 256); autoresizesSubviews = NO; layer = <UIPeripheralHostLayer: 0x1e4e60>> 
    | | <UIKeyboardAutomatic: 0x1ad300; frame = (0 40; 320 216); opaque = NO; layer = <CALayer: 0x1ad3b0>> 
    | | | <UIKeyboardImpl: 0x1ad520; frame = (0 0; 320 216); opaque = NO; layer = <CALayer: 0x1ad6c0>> 
    | | | | <UIKeyboardLayoutStar: 0x1d47c0; frame = (0 0; 320 216); layer = <CALayer: 0x19ca40>> 
    | | | | | <UIKBKeyplaneView: 0x1df880; frame = (0 0; 320 216); layer = <CALayer: 0x1df900>> 
    | | | | | | <UIKBKeyView: 0x1dfe00; frame = (1 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1dffd0>> 
    | | | | | | <UIKBKeyView: 0x1e0090; frame = (279 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e00e0>> 
    | | | | | | <UIKBKeyView: 0x1e01e0; frame = (1 173; 38 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0230>> 
    | | | | | | <UIKBKeyView: 0x1dbfb0; frame = (41 173; 38 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1dc050>> 
    | | | | | | <UIKBKeyView: 0x1e0330; frame = (81 173; 158 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0380>> 
    | | | | | | <UIKBKeyView: 0x1e0440; frame = (241 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0490>> 
    | | <CKMessageEntryView: 0x182500; baseClass = UIImageView; frame = (0 0; 320 40); opaque = NO; autoresize = W+TM; layer = <CALayer: 0x1837c0>> 
    | | | <UIButton: 0x1878c0; frame = (6 8; 26 27); hidden = YES; opaque = NO; autoresize = RM+TM; layer = <CALayer: 0x182e60>> 
    | | | | <UIImageView: 0x1e56f0; frame = (0 0; 26 27); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e5720>> 
    | | | <UIView: 0x184dd0; frame = (7 0; 245 40); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x185130>> 
    | | | <CKContentEntryView: 0x188a50; baseClass = UIScrollView; frame = (6 0; 249 40); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x187230>; contentOffset: {-0, -10}> 
    | | | | <CKRichContentView: 0x193790; baseClass = UITextContentView; frame = (0 0; 249 20); text = ''; autoresize = W; layer = <CALayer: 0x1938a0>> 
    | | | | | <UIWebDocumentView: 0xaef200; frame = (0 0; 249 20); text = ' 
'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x196c20>> 
    | | | | | <UITextSelectionView: 0x1a5b60; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x1a5c00>> 
    | | | | <UIImageView: 0x189fa0; frame = (242 10; 7 20); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x189ff0>> 
    | | | | <UIImageView: 0x189eb0; frame = (242 23; 7 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x189f00>> 
    | | | <UIImageView: 0x18a190; frame = (7 0; 245 40); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x18a510>> 
    | | | <UILabel: 0x18a6b0; frame = (245 13; 73 15); text = 'TEST'; clipsToBounds = YES; hidden = YES; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x18a720>> 
    | | | <UIButton: 0x180d00; frame = (252 8; 61 27); opaque = NO; autoresize = LM+TM; layer = <CALayer: 0x184e00>> 
    | | | | <UIImageView: 0x1ad460; frame = (0 0; 61 27); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1ad490>> 
    | | | | <UIButtonLabel: 0x1871c0; frame = (11 3; 39 20); text = 'Send'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x187280>> 

的iOS 6.0:

<UIWindow: 0x1fd81f80; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x1fd82080>> 
    | <UILayoutContainerView: 0x1fd94d50; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x1fd94df0>> 
    | | <UINavigationTransitionView: 0x1fd9a450; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1fd9a520>> 
    | | | <UIViewControllerWrapperView: 0x1fdac9a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1fdaca30>> 
    | | | | <UIView: 0x1fda8cb0; frame = (0 0; 320 460); autoresize = W+H; layer = <CALayer: 0x1fda8c70>> 
    | | | | | <_UISizeTrackingView: 0x1fda6430; frame = (0 0; 320 460); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1fda6510>> 
    | | | | | | <_UIRemoteView: 0x1fda6700; frame = (0 0; 320 480); transform = [0.5, -0, 0, 0.5, -0, 0]; userInteractionEnabled = NO; layer = <CALayerHost: 0x1fda6850>> 

我的問題是需要的UIButton怎麼能在UITextEffectsWindow中找到?

看來,在iOS6的視圖層次結構以某種方式改變......

我希望得到任何幫助。謝謝!

回答

1

它很可能是它改變了。您正在訪問用戶界面中顯示的未記錄元素,但不能保證在系統更新期間保持一致。如果您想更改MFMailComposeViewController類中提供的UI元素的外觀,請使用IUAppearance API。你不應該訪問很多郵件控制器類。

重要郵件撰寫界面本身不可定製,不能由您的應用程序修改。另外,在呈現界面之後,您的應用程序不允許對電子郵件內容進行進一步更改。用戶仍然可以使用界面編輯內容,但程序化更改將被忽略。因此,您必須在呈現界面之前設置內容字段的值。

+0

如此多的答案假設您正在編寫一個應用程序,該應用程序將位於App Store中,甚至在屬於該用戶的iPad/iPhone上運行。 我們中的一些人在內部應用程序甚至服務終端上工作,在這些應用程序中,訪問部分界面(如recient到reciepents)實際上是一些國家(如法國)的隱私問題。那麼我們該怎麼辦?我們破解了郵件編輯器......或者至少我們做到了。這在iOS6中非常不透明。我會爲此創建一個主題,但我相信我會得到10k的大拇指。 -e – eric

+0

您可能會得到更多的大拇指,原因是您的「黑客」在未經用戶同意的情況下正在做某件事。你真的想發送一封電子郵件與用戶的電子郵件帳戶?實現您自己的郵件客戶端,向用戶詢問憑據,併發送您想要發送的所有電子郵件。 – J2theC

+0

啊,如果只有客戶會這樣做。這是我原本第一次,也是最強的選擇,以及他們支付給我的2次操作系統升級以保持重新黑客入侵......但最終,客戶端「永遠是對的」。我們將看到,因爲這現在不是iOS6的選項,希望我可以通過REST調用來傳遞他們想要從Kiosk發送的電子郵件......我只是想指出,許多答案都假設可能不應該被做。 :-) – eric