2014-11-06 16 views
8

Tôi đã xem xét tất cả hơn cho một câu trả lời cho điều này và tôi đã cố gắng để thực hiện nó, nhưng không có gì là làm việc. Về cơ bản, tôi cần có khả năng quan sát các thay đổi trong mảng xem phụ của khung nhìn VC. Nếu một khung nhìn hiện có bị loại bỏ khỏi mảng đó, tôi muốn được thông báo về nó và chạy một số mã.Tôi có thể KVO quan sát các thay đổi trong mảng phụ của UIView không?

Có thể không?

EDIT - Thông tin chi tiết

tôi đang cố gắng để thực hiện một sửa chữa cho một trường hợp cạnh lạ lỗi nơi nhanh chóng khai thác trên UISearchBar của một UISearchDisplayController (rất tùy chỉnh) làm cho sdController (hay đúng hơn là Searchbar quản lý có hiệu lực Navbar) biến mất khỏi khung nhìn, nhưng sdController là STILL ACTIVE. Điều này có nghĩa là navBar vẫn ở thời điểm gốc và bảngView bên dưới không thể cuộn được.

Suy nghĩ ban đầu của tôi là đi đến trạng thái nơi sdController hoạt động, nhưng UISearchDisplayControllerContainerView không nằm trong hệ thống phân cấp khung nhìn. Tôi đã thử nghiệm này trong viewDidLayoutSubviews của VC, nhưng than ôi, khi bạn gõ vào một thanh tìm kiếm và bắt đầu hoạt hình sdController, sdController đang hoạt động, và UISearchDisplayControllerContainerView không có trong hệ thống phân cấp khung nhìn: (

+0

thủ đoạn bẩn: bài thông báo qua NSNotificationCenter nơi bạn loại bỏ subview và nắm bắt nó khi bạn cần phải chạy một số mã. Hoặc sử dụng các đại biểu. –

+2

Bạn không thể xem phụ đề của KVO. Tuy nhiên, hệ thống sẽ gửi 'layoutSubviews' đến một chế độ xem khi nó đã đạt được hoặc bị mất các bản xem trước (nếu người giám sát ở trong hệ thống phân cấp xem trên màn hình). Có lẽ bạn có thể sử dụng một lớp con 'UIView' tùy chỉnh làm superview, và làm những gì bạn cần trong' layoutSubviews'. Nếu điều đó không đủ, hãy chỉnh sửa câu hỏi của bạn để bao gồm thêm chi tiết về ** lý do tại sao ** bạn muốn được thông báo khi tiểu sử bị xóa. Chúng tôi có thể có thể cung cấp cho bạn một giải pháp tốt hơn. –

+0

@robmayoff cảm ơn nhận xét. Tôi đã cập nhật câu hỏi của mình. – Lizza

Trả lời

3

Như với hầu hết tài sản trong khuôn khổ của Apple subviewsis not KVO compliant

Nếu bạn kiểm soát một trong hai subview hoặc superView bạn có thể quan sát những thay đổi trong hệ thống phân cấp xem bằng cách subclassing và trọng:.

trong superView bạn phải ghi đè ...

- (void)willRemoveSubview:(UIView *)subview 

... hoặc, nếu bạn kiểm soát các subview, bạn sẽ ghi đè lên ...

- (void)willMoveToSuperview 

Cả hai phương pháp này được gọi là trước khi xem được lấy ra.

11

Bạn có thể quan sát thuộc tính sublayers của CALayer, tuân thủ KVO, thay vì UIView subviews.

+1

công trình này thực sự. giải pháp tuyệt vời! – Denis

+0

Vui lòng cung cấp liên kết đến tài liệu cho biết rằng Hoạt ảnh cốt lõi nói chung hoặc các phần phụ của CALayer nói riêng là tuân thủ KVO. Theo sự hiểu biết của tôi thì không. (Lưu ý: tuân thủ KVC không ngụ ý tuân thủ KVO). –

1

Swift 3.x

xem sử dụng tùy chỉnh Iike

class ObervableView: UIView { 
    weak var delegate:ObservableViewDelegate? 

    override func didAddSubview(_ subview: UIView) { 
     super.didAddSubview(subview) 
     delegate?.observableView(self, didAddSubview: subview) 
    } 

    override func willRemoveSubview(_ subview: UIView) { 
     super.willRemoveSubview(subview) 
     delegate?.observableview(self, willRemoveSubview: subview) 
    } 

} 

protocol ObservableViewDelegate: class { 
    func observableView(_ view:UIView, didAddSubview:UIView) 
    func observableview(_ view:UIView, willRemoveSubview:UIView) 
} 

//Use 

class ProfileViewController1: UIViewController, ObservableViewDelegate { 
    @IBOutlet var headerview:ObervableView! //set custom class in storyboard or xib and make outlet connection 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     headerview.delegate = self 
    } 

    //Delegate methods 
    func observableView(_ view: UIView, didAddSubview: UIView) { 
     //do somthing 
    } 

    func observableview(_ view: UIView, willRemoveSubview: UIView) { 
     //do somthing 
    } 
} 
Các vấn đề liên quan