2013-04-05 28 views
6

Tôi đang thử nghiệm cách tải các tệp nib lên UIViewController.Đang tải một tệp nib bên trong UIViewController

Tôi đã tạo một tệp nib riêng biệt được gọi là Email. Đầu tiên tôi nhận thấy rằng khi bộ điều khiển xem được tải, phương thức initWithNibName không được gọi. Vì vậy, tôi gọi nó theo phương pháp viewDidLoad theo cách thủ công như thế này,

[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]]; 

Nó không hoạt động. Ngoài ra tôi nhận được cảnh báo nói rằng Kết quả biểu hiện không được sử dụng.

Và tôi đã tìm kiếm trên internet và đã xem qua bài viết this và thực hiện các phương pháp loadView như mô tả như vậy,

- (void)loadView 
{ 
    [super loadView]; 

    UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil]; 
    [nib instantiateWithOwner:self options:nil]; 
} 

Phương pháp này được gọi nhưng vẫn điều khiển xem là trống rỗng!

Ai có thể cho tôi biết những gì tôi nhìn thấy ở đây và cách thực hiện điều này?

Cảm ơn bạn.

UPDATE:

Trước hết, cảm ơn vì tất cả các câu trả lời. Tuy nhiên voromaxsvena 's câu trả lời cho thấy rằng tôi nên loại bỏ segues và tải nibs tự động mà tôi không phải là rất thích. Câu trả lời của Anil hoạt động tìm thấy và bây giờ tôi có một trở ngại cuối cùng để nhảy.

Tôi có nhiều tệp nib. Tùy thuộc vào lựa chọn của người dùng, nó sẽ tải một nib cụ thể. Vì vậy, những gì tôi đã cố gắng là, đặt tất cả các ngòi bên trong các mảng như vậy,

- (void)loadView 
{ 
    [super loadView]; 

    NSArray *nibs = [[NSArray alloc] initWithObjects: 
        [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil], 
        [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil]; 


    self.view = [nibs objectAtIndex:0]; 
} 

và truy cập nó bằng cách sử chỉ số của nó như self.view = [nibs objectAtIndex:1]; này. Nhưng nó ném một lỗi * Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: '- [__ NSArrayM _setViewDelegate:]: unrecognized selector gửi đến dụ 0xd56fd20' *

Tại sao lỗi này xuất hiện? Nếu nó không thể, tôi mở để gợi ý.

Xin cảm ơn một lần nữa. Và xin lỗi vì đã kéo nó ra một chút.

+0

Bạn vẫn không đề cập đến cốt truyện và logic tùy chỉnh trong câu hỏi của bạn, không phải ai cũng sẽ đọc tất cả các ý kiến ​​... Xem câu trả lời được cập nhật – voromax

Trả lời

1

Bạn không được phép nạp ngòi cho bộ điều khiển chế độ xem từ bên trong các phương thức của bộ điều khiển chế độ xem đó.

Nếu bạn muốn khởi tạo bộ điều khiển chế độ xem từ ngòi, bạn làm điều đó từ bên ngoài bộ điều khiển chế độ xem đó, thường là bộ điều khiển chế độ xem trình bày.

Nếu bạn đang tìm kiếm móc trong bộ điều khiển chế độ xem được trình bày đã có kết nối đầu ra được thiết lập, hãy ghi đè -awakeFromNib là lựa chọn phổ biến. -viewDidLoad là loại khác.

Update # 1

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 
    if (/*do your segue identification stuff*/) { 
     UIViewController *myViewController = /*init your view controller here*/ 
     UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController]; 
     [self presentViewController:navigationController animated:YES completion:nil]; 
     return NO; 
    } 
    return YES; 
} 
+0

Có một 'UITableViewController' như bộ điều khiển xem trước đó vì vậy tôi đã thử tải nib khi instantiating nó ngay trước khi segue xảy ra. 'NewMailViewController * newMailVC = [[Phân bổ NewMailViewController] initWithNibName: @" Email "bundle: nil]; newMailVC = [segue destinationViewController]; 'Nhưng nó không hoạt động. – Isuru

+1

Từ nhận xét của bạn, tôi kết luận rằng bạn đang sử dụng bảng phân cảnh. Bảng phân cảnh sẽ khởi tạo bộ điều khiển chế độ xem của bạn cho bạn và bạn không tự tải những ngòi bút đó. Có lý do tại sao bạn muốn quay lại để tải từ nib từ việc sử dụng bảng phân cảnh không? – svena

+0

Có, tôi đang sử dụng Bảng phân cảnh. Xin lỗi tôi nên đã đề cập rằng trong câu hỏi. Kịch bản là như thế này. Tôi đang tạo một ứng dụng thư tùy chỉnh và có nhiều loại thư. Đối với mỗi loại thư, giao diện người dùng khác nhau. Vì vậy, những gì tôi đã làm, tạo ra một nib riêng biệt cho mỗi loại thư, có một 'UITableViewController' để liệt kê các loại thư và khi nó phân biệt, tùy thuộc vào lựa chọn của người dùng nó tải tệp nib cụ thể vào một' UIViewController'. – Isuru

1

Bạn nên sử dụng các tập tin nib để nhanh chóng điều khiển xem bản thân tôi. e.

UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil]; 

Sau đó bạn có thể trình bày điều khiển này

Cập nhật

Trong trường hợp nếu bạn cần phải chọn xem điều khiển nên được nạp bởi logic ứng dụng nó là tốt hơn để tạo ra tất cả các bộ điều khiển xem trong một storyboard, bỏ qua ràng buộc segue cứng và sử dụng phương pháp instantiateViewControllerWithIdentifier: của thể hiện bảng phân cảnh của bạn để có bộ điều khiển xem thích hợp và trình bày nó theo cách thủ công. Tôi giả định rằng quan điểm điều khiển bảng của bạn là đã có trong điều khiển chuyển hướng:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    if (APPROPRIATE_INDEX_PATH) { 
     UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER]; 
     [self.navigationController pushViewController:ctrl animated:YES]; 
    } 
} 
+0

Có một 'UITableViewController' làm bộ điều khiển xem trước đó nên tôi đã thử tải nib khi khởi tạo ngay trước khi segue xảy ra. 'NewMailViewController * newMailVC = [[Phân bổ NewMailViewController] initWithNibName: @" Email "bundle: nil]; newMailVC = [segue destinationViewController]; 'Nhưng nó không hoạt động. – Isuru

+1

Bạn có thể hủy phân đoạn này bằng '- shouldPerformSegueWithIdentifier: sender:' return NO và tải bộ điều khiển của bạn theo cách thủ công – voromax

9

Sử dụng mã dưới đây để tải một cái nhìn từ ngòi bút và sử dụng như xem bộ điều khiển quan điểm của

- (void)loadView 
{ 
[super loadView]; 

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil]; 
self.view = [nib objectAtIndex:0]; 
} 

Sửa

Tải một ngòi bút đơn theo lựa chọn của người dùng. Xem tải một đơn nib

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil]; 

sẽ trả về một mảng đối tượng. Từ câu hỏi được cập nhật của bạn, tôi có thể thấy bạn đang lưu trữ các mảng này vào một mảng khác. Bây giờ mảng nib của bạn là một mảng các đối tượng 'mảng'.

self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

sẽ hoạt động.

Nhưng nó không phải là tốt, tải một nib đơn theo choise dùng

+0

Cảm ơn bạn đã trả lời. Phương pháp này hoạt động và tôi có một câu hỏi phụ. Tôi có nhiều tập tin nib. Tùy thuộc vào lựa chọn của người dùng, nó sẽ tải một nib cụ thể. Vì vậy, những gì tôi đã thử được, đặt tất cả các ngòi bên trong mảng như [this] (http://pastebin.com/rcpHTTSY) và truy cập nó bằng cách sử dụng chỉ mục của nó liek này 'self.view = [nibs objectAtIndex: 1];'. Nhưng nó ném một lỗi _Terminating ứng dụng do uncaught ngoại lệ 'NSInvalidArgumentException', lý do: '- [__ NSArrayM _setViewDelegate:]: unrecognized selector gửi đến dụ 0xd56fd20'_ Tôi có thiếu một cái gì đó hoặc là có một cách khác để đi về nó? – Isuru

+0

Bạn có thể đăng mã của mình cùng với câu hỏi không? Tôi không thể truy cập trang đó. Trên thực tế mảng nib trả về bởi __loadNib__ không chỉ chứa các view, nó chứa tất cả các điều khiển trong nib của bạn (button/label ..) objectAtIndex [0] sẽ là đối tượng mức cao nhất (có thể là một khung nhìn nếu bạn có một lần xem mỗi nib). Với việc nhìn thấy mã của bạn, tôi không thể nói chính xác vấn đề –

+0

Tôi đã cập nhật câu hỏi của mình ở trên. – Isuru

Các vấn đề liên quan