2013-09-25 94 views
7

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?

enter image description here

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ẽ.

+0

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

+0

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

Trả lời

4

how can I tell the run-time that they are both in fact the very same thing instead of two separate entities?

Bạn không thể vì chúng không giống nhau. Bạn đã tạo hai số SearchViewControllerPro.

Bạn cần phân bổ-init phiên bản SearchViewControllerPro hoặc hủy lưu trữ một bản sao khỏi ngòi bút.

Nếu bạn quyết định tạo ViewController trong nib, cách thông thường để truy cập nó giống như cách bạn truy cập bất kỳ mục nào khác (dạng xem, nút, trường văn bản) mà bạn tạo trong một ngòi bút.

Thêm ổ cắm vào đối tượng FilesOwner, nối kết nối trong trình tạo giao diện và đảm bảo truyền đối tượng khi bạn hủy lưu trữ ngòi bút.

ví dụ: Nếu bạn muốn đối tượng mà unarchives nib là FilesOwner:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

Cảm ơn câu trả lời của bạn. Tôi không chắc tôi hiểu nó. Tôi chỉ cố gắng để lấy '' ViewController'' từ bên trong ngòi, nhưng không có may mắn ở đó (xem chỉnh sửa của tôi ở trên, là những gì bạn có ý nghĩa?). Trên bình luận của bạn: Có, tôi biết rằng ngay bây giờ, tôi có hai trường hợp. Những gì tôi có nghĩa là để nói là, tôi muốn giải quyết chúng vào cùng một đối tượng và không biết làm thế nào để làm điều đó trong IB hoặc mã, kể từ khi phân bổ-initing không (xem lỗi ở trên). – Chris

+0

Điều gì có nghĩa là 'giải quyết hai trường hợp vào cùng một đối tượng'? Nếu tôi làm: ob1 = [SearchViewControllerPro alloc] init]; ob2 = [SearchViewControllerPro alloc] init]; (và đây là những gì bạn đã làm) Làm thế nào tôi sẽ giải quyết chúng cho một ví dụ? Hai đối tượng là hai đối tượng. – hooleyhoop

+2

Hãy để tôi thuật lại câu hỏi: Tôi biết làm thế nào để tải một nib như một cái nhìn vào một '' UIViewController''. Kể từ khi cho iOS7 tôi cần phải đặt lại vị trí các yếu tố liên quan đến topLayoutGuide, tôi đã phải đặt một bộ điều khiển xem như là yếu tố cấp cao nhất trong một ngòi, và những nỗ lực của tôi để tải nó cho đến nay đã thất bại. Bạn đang mô tả các triệu chứng một cách chính xác - do cấu trúc của ngòi và cách tôi cố gắng để khởi tạo bộ điều khiển xem, tôi nhận được hai đối tượng. Nhưng tôi không biết để thiết lập ngòi và tải cuộc gọi để tôi kết thúc với chỉ có một. Tôi hy vọng điều đó sẽ giải thích tốt hơn. – Chris

3

Các công việc sau khi tốt và (ít nhất là với tôi) là một chút rõ ràng hơn rằng việc tạo một lối thoát cho các ViewController:

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

Mặc dù mã này có thể giúp giải quyết vấn đề, nó không giải thích _why_ và/hoặc _how_ nó trả lời câu hỏi. Việc cung cấp ngữ cảnh bổ sung này sẽ cải thiện đáng kể giá trị giáo dục lâu dài của nó. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích, bao gồm những giới hạn và giả định được áp dụng. –