2009-06-05 32 views
11

Tôi đã viết một lớp con UITabBarController (được gọi là MainViewController) và thêm một vài biến mẫu, cụ thể là địa điểm của loại Địa điểm. Mỗi tab của số MainViewController cần truy cập biến địa điểm của MainViewController. Trong tab đầu tiên, một lớp con UIViewController tên HomeViewController, tôi đã viết phương pháp viewDidLoad tôi và cố gắng để xuất ra NSLog với cả hai ...Truy cập các thuộc tính của bộ điều khiển chế độ xem (tùy chỉnh)

NSLog(@"%@", self.parentViewController.venue.name); 

NSLog(@"%@", self.tabBarController.venue.name); 

Nhưng XCode cung cấp cho các lỗi

error: request for member 'venue' in something not a structure or union 

Tôi có thể truy cập thuộc tính địa điểm từ bên trong MainViewController tốt mà đã loại trừ lỗi ở đó. Trình mô phỏng iPhone không nhìn thấy cả hai self.parentViewControllerself.tabBarController dưới dạng phiên bản MainViewController. Điểm mấu ...

NSLog(@"%@", self.tabBarController); 

đầu ra ...

2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600> 

Kể từ khi nó được xem như một trường hợp MainViewController, tôi nghi ngờ sử dụng đúc sẽ giúp đỡ. Là lựa chọn duy nhất khác của tôi để khởi tạo HomeViewController với bản sao của địa điểm hoặc tôi chỉ đang làm điều gì đó hoàn toàn sai với 'self.parentViewController.venue.name'? Cảm ơn, Rob

+0

Bạn đã thiết lập địa điểm và tên là thuộc tính chính xác chưa? tức là những người truy cập tuân thủ KVC viết hoặc đã sử dụng @property và @synthesize? – Abizern

Trả lời

26

Bạn đang làm điều gì đó hoàn toàn sai. parentViewController được khai báo là UIViewController. NSLog ing nó đầu ra loại thực của nó do những kỳ quan của đa hình.

UIViewController không có thành viên Venue. MainViewController của bạn. Đúc nó là, trên thực tế, câu trả lời đúng. Đảm bảo nhập MainViewController.h.

#import "MainViewController.h" 
[...] 
NSString *name = ((MainViewController *)self.parentViewController)).venue.name; 

Ngoài ra hãy chắc chắn rằng, tất nhiên, đó venue được khai báo là một @property của MainViewController, và name là một @property của Venue.

+0

Tuyệt vời, cảm ơn. Tôi đã cố gắng để đúc ngay trước đó nhưng lộn xộn khung của tôi allll lên. – rob5408

+1

Câu trả lời hay. Tôi cho rằng câu đầu tiên là không cần thiết. Đó là một câu hỏi hay. – Darkenor

+1

Để công bằng, câu hỏi của anh ta là "Chỉ có tùy chọn khác của tôi để khởi tạo HomeViewController với một bản sao của địa điểm hoặc tôi chỉ làm điều gì đó hoàn toàn sai với 'self.parentViewController.venue.name'?" –

1

Tuyên bố NSLog() của bạn là "nhìn thấy" nó dưới dạng MainViewController bởi vì đó là những gì đối tượng thực sự là. Tuy nhiên, vấn đề bạn gặp phải là trình biên dịch không thực sự nhận ra điều này vì thuộc tính parentViewController được khai báo là đồng bằng cũ UIViewController. Mặc dù bạn đang thực sự trả về một lớp con của nó, theo như trình biên dịch biết bạn đang cố gọi phương thức đó trên UIViewController và nó sẽ khiếu nại. Truyền nó tới một số MainViewController sẽ giải quyết vấn đề.

2
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController]; 

//previous view controller 
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1]; 

account.property = object; 
[account doSmthng]; 
Các vấn đề liên quan