2014-11-05 67 views
4

我在storyboard中創建了UITextField。並增加了它的約束條件。我想要UITextField左側的搜索圖標。添加搜索圖標的代碼如下:ios中的UITextField的Autolayout問題

self.searchTextField.leftView = searchIconImage; 
    self.searchTextField.leftViewMode = UITextFieldViewModeAlways; 
    [self.searchTextField addTarget:self 
        action:@selector(textFieldDidChange:) 
     forControlEvents:UIControlEventEditingChanged]; 

我的應用程序在iOS8上正常工作,並在iOS7上崩潰。該錯誤是如下:

斷言故障 - [的UITextField layoutSublayersOfLayer:],/SourceCache/UIKit/UIKit-2935.138/UIView.m:8794 2014年11月5日12:54:33.377 WattUp [1722 :60b]由於未捕獲異常'NSInternalInconsistencyException'而終止應用程序,原因:'在執行-layoutSubviews之後仍然需要自動佈局。 UITextField的-layoutSubviews實現需要調用super。'

+2

查看最後一條語句錯誤。 UITextField的-layoutSubviews實現需要調用super。'你有沒有繼承UITextfield? – Spectravideo328 2014-11-05 07:43:35

+0

@ Spectravideo328是的,我的子類UITextField。我的應用在iOS8上運行良好。該問題僅在iOS7上。 – Rakesh 2014-11-05 08:13:46

+0

你說的超級評論說嗎? – Spectravideo328 2014-11-05 08:42:25

回答

8

所以我幾天前也遇到過這個相同的錯誤。事實證明,我試圖在我的UITextfield子類中設置子視圖,在它們上設置屬性,移動它們等,但從未明確告訴視圖放置(即調用[self layoutIfNeeded])。

iOS 8似乎強制一個視圖來佈置所有子視圖,然後配置它的約束。如果您使用自動佈局,iOS 7將不會,並且需要您明確告訴視圖以在您更改時重繪其子視圖。

就我而言,我已將子類別UITextField添加到旁邊並添加了標籤。我通過向UITextfield添加約束來配置標籤的框架。其中一個公共方法,我可以在我的課呼叫

- (void)setLabelText:(NSString *)newText{ 
    self.sideLabel.text = newText; 
} 

這引起了我的應用程序崩潰,當一個視圖控制器出現包含我的子類文本框。通過添加layoutIfNeeded一切工作正常在iOS7和iOS8。

- (void)setLabelText:(NSString *)newText{ 
    self.sideLabel.text = newText; 
    [self layoutIfNeeded]; 
} 

這需要在您每次更改子類視圖的一部分時調用。這包括添加子視圖時的設置,更改視圖屬性時的設置。在更改視圖的功能返回之前,請在視圖上調用layoutIfNeeded。這似乎適用於一些標準的UI控件,包括UITextfield,UITableView和UICollectionView,但我確定還有其他的。我希望這已經足夠清晰並有助於解決您的問題。

你得到的錯誤不是非常有用,甚至不適用於我的情況。雖然我收到了完全相同的錯誤,但是我的觀點沒有實現layoutSubviews,因此都使用了[super layoutSubviews]方法。

+0

謝謝!這解決了我遇到的一個非常煩人的問題。一切工作正常在iOS 8上,但沒有在iOS 7上工作 – Endama 2014-12-09 22:21:52

+0

謝謝!在我的情況下,我寫了一個自定義範圍滑塊,並得到了與原始問題中列出的相同的錯誤。我重寫了'layoutSubViews'來處理調整大小期間重新定位滑塊大拇指。在我的情況下,錯誤信息是部分正確的,因爲我忘記調用'layoutSubviews'中的超類。除此之外,我需要您的解決方案,即在重新定位拇指的調用之後添加'[self layoutIfNeeded]'。 – 2015-01-07 21:25:49

0

我解決了這個通過繼承的UITextField和重新實現2種方法:

- (void)setText:(NSString *)text 
{ 
    [super setText:text]; 
    [self layoutIfNeeded]; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
} 

真的annoing的事情。蘋果讓程序員頻頻哭泣