2015-09-19 19 views
16

Tôi đang cố giải quyết lỗi vị trí chế độ xem đã phát sinh từ iOS 9. Tôi đang tạo trình điều khiển chế độ xem từ tệp xib (không tự động trả lời) và sau đó đẩy cái này lên số UINavigationController của tôi.iOS 9: Khung không còn được đặt trong chế độ xemWillAppear sau khi UINavigationController pushViewController

Vấn đề là khi phương thức viewWillAppear của bộ điều khiển xem được gọi, khung của nó chưa được điều chỉnh theo kích thước của bộ điều hướng và vẫn là những gì được đặt trong tệp xib. Nó không được thiết lập đúng ngay bây giờ cho đến viewDidAppear.

Điều này hoàn toàn làm hỏng mã của tôi. Có ai biết chính xác những gì đã thay đổi đang gây ra điều này và cách tốt nhất để xử lý nó là gì? Tôi không muốn đợi cho đến khi viewDidAppear vì điều này sẽ có vẻ xấu và tạo ra trải nghiệm người dùng kém.

+1

Tôi đang gặp phải vấn đề tương tự. Sau khi kiểm tra thêm, có vẻ như chế độ xem con chưa được thêm vào chế độ xem của UINavigationController (xem.superview == nil) –

Trả lời

11

Tôi cũng đang tìm cách khắc phục tốt nhất.

Tạm thời của tôi là gọi mã trong "viewDidAppear" trong "viewDidLayoutSubviews". Bằng cách đó, mã của tôi sẽ được gọi ngay khi khung được đặt.

Tuy nhiên, hãy chắc chắn để thêm một boolean hoặc một cái gì đó để mã của bạn không nhận được gọi mỗi khi viewDidLayoutSubviews được gọi

-(void)viewDidLayoutSubviews{ 
    if (didLayoutSubviews == NO){ 
     didLayoutSubviews = YES; 
     // perform code that was in viewWillAppear 
    } 
} 
+0

Cảm ơn Nick, điều này đã làm được điều này! Đáng tiếc là điều này là cần thiết. 'viewWillAppear' là nơi lý tưởng hoàn hảo để đặt mã này trước đây. Bây giờ nó cảm thấy như chúng ta phải làm một hack để làm những gì đến tự nhiên trước. :( – devios1

0

tôi xảy ra vấn đề này quá,

cố gắng để bỏ chọn tùy chọn " Thay đổi kích thước chế độ xem từ NIB "từ bảng phân cảnh

0

Thử di chuyển mã bố trí từ viewWillAppear đến viewWillLayoutSubviews.

0

Một chút cập nhật NickProvost của câu trả lời:

private var loadViewToken: dispatch_once_t = 0 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    dispatch_once(&loadViewToken) { [weak self] in 
     if let wSelf = self { 
      wSelf.setupView() 
     } 
    } 
} 
Các vấn đề liên quan