Tôi đã có một ngòi bút với một phần tử gốc view controller như thế này:Làm thế nào để tải XIB với một ViewController cấp cao nhất?
vì vậy tôi có thể xác định vị trí các yếu tố liên quan đến các hướng dẫn bố trí trên và dưới sử dụng tính năng tự động bố trí.
Khi tôi lần đầu tiên đã cố gắng để tải nib này sử dụng
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
Tôi có thời gian chạy ngoại lệ sau đây:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'
Googling lỗi nó đã được chỉ ra cho tôi, rằng chủ sở hữu tập tin của xib cần thiết để được đặt thành lớp của bộ điều khiển xem của tôi và cửa sổ xem phải được đặt thành đối tượng xem trong xib. Nếu tôi làm như vậy, sau đó tôi nhận được lỗi thời gian chạy sau:
Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'
Không gì đáng ngạc nhiên kể từ khi xem được liên quan đến cả hai chủ sở hữu tập tin và bộ điều khiển xem top-level của ngòi bút. Nhưng làm thế nào tôi có thể nói với thời gian chạy rằng cả hai thực tế là một điều rất giống nhau thay vì hai thực thể riêng biệt?
Edit: Khi tôi cố gắng unpck các ViewController từ ngòi bút như vậy,
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
, nó không tốt hoặc là:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.
Giải pháp tạm thời:
Tôi tìm thấy một giải pháp, nhưng nó không phải là đẹp. Mặc dù cấu trúc như được hiển thị trong IB, bộ điều khiển xem không phải là đối tượng cuối cùng trong xib. Vì vậy, tôi có:
__block SearchViewControllerPro* mapSearchViewController = nil;
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[SearchViewControllerPro class]]) {
mapSearchViewController = obj;
}
}];
và điều này dường như hoạt động mà không có lỗi thời gian chạy. Tuy nhiên, đó là tất cả mọi thứ nhưng mã sạch sẽ.
Về chỉnh sửa của bạn .. bạn có sai sót trong nib của bạn. Bạn cần đảm bảo tên Lớp là chính xác và bạn phải ngắt kết nối thủ công bất kỳ kết nối nào không chính xác mà bạn đã thực hiện. Bạn đã đặt làm lớp học của FilesOwner như thế nào? Bạn đã tạo kết nối gì với FilesOwner? – hooleyhoop
Ok nó không quan trọng những gì bạn đặt Class của FilesOwner miễn là bạn nhận ra nó sẽ thay đổi tùy thuộc vào việc bạn làm [NSBundle mainBundle] loadNibNamed: ... hoặc SearchViewControllerPro alloc] initWithNibName: ... do đó bất kỳ kết nối bạn đã thực hiện cho FilesOwner sẽ không hợp lệ (bạn sẽ bị lỗi) nếu bạn thay đổi phương thức tải – hooleyhoop