2013-03-08 1 views
1

Я только начинаю с Objective -C. Мой код продолжает давать ошибку: Property 'view' не может быть найден в объекте прямого класса 'startPageViewController'. Я не могу понять, что это такое! Вот мой код.iOS - Свойство 'view' не может быть найдено в объекте прямого класса

startPageViewController.h -

#import <UIKit/UIKit.h> 

@class searchResultsViewController; 
@class startPageViewController; 

@interface startPageViewController : UIViewController 

- (IBAction)switchViews:(id)sender; 

@property (strong, nonatomic) IBOutlet UITextField * searchterm; 
@property (nonatomic, retain) startPageViewController *blueViewController; 
@property (nonatomic, retain) searchResultsViewController *yellowViewController; 

@end 

startPageViewController.m -

#import "startPageViewController.h" 
#import "searchResultsViewController.h" 

@class searchResultsViewController; 
@class startPageViewController; 

@interface startPageViewController() 

@end 

@implementation startPageViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 

- (IBAction)switchViews:(id)sender { 
    [self.view removeFromSuperview]; // <-- Error here 
    [self.view insertSubview:_yellowViewController.view atIndex:0]; 
} 

- (void)viewDidUnload { 
    [self setSearchterm:nil]; 
    [super viewDidUnload]; 
} 
@end 

searchResultsViewController.h -

#import <UIKit/UIKit.h> 

@interface searchResultsViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UIWebView *googleResults; 
@property (strong, nonatomic) IBOutlet UIWebView *bingResults; 
@property (strong, nonatomic) IBOutlet UIWebView *amazonResults; 
@property (strong, nonatomic) IBOutlet UIWebView *ebayResults; 

@end 

searchResultsViewController.m -

#import "searchResultsViewController.h" 

@interface searchResultsViewController() 

@end 

@implementation searchResultsViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *googleUrlAddress = @"http://www.google.com/"; 
    NSURL *googleUrl = [NSURL URLWithString:googleUrlAddress]; 
    NSURLRequest *googleRequestObj = [NSURLRequest requestWithURL:googleUrl]; 
    [_googleResults loadRequest:googleRequestObj]; 
    // -------------------- 
    NSString *bingUrlAddress = @"http://www.bing.com/"; 
    NSURL *bingUrl = [NSURL URLWithString:bingUrlAddress]; 
    NSURLRequest *bingRequestObj = [NSURLRequest requestWithURL:bingUrl]; 
    [_bingResults loadRequest:bingRequestObj]; 
    // -------------------- 
    NSString *amazonUrlAddress = @"http://www.amazon.com/"; 
    NSURL *amazonUrl = [NSURL URLWithString:amazonUrlAddress]; 
    NSURLRequest *amazonRequestObj = [NSURLRequest requestWithURL:amazonUrl]; 
    [_amazonResults loadRequest:amazonRequestObj]; 
    // -------------------- 
    NSString *ebayUrlAddress = @"http://www.ebay.com/"; 
    NSURL *ebayUrl = [NSURL URLWithString:ebayUrlAddress]; 
    NSURLRequest *ebayRequestObj = [NSURLRequest requestWithURL:ebayUrl]; 
    [_ebayResults loadRequest:ebayRequestObj]; 
} 

- (void)viewDidUnload { 
    [self setGoogleResults:nil]; 
    [self setBingResults:nil]; 
    [self setAmazonResults:nil]; 
    [self setEbayResults:nil]; 
    [super viewDidUnload]; 
} 
@end 

Заранее благодарен!

Кстати, ничего слишком сложного, пожалуйста. Мне всего 12. :)

+0

Где вы используете 'blueViewController.view'? Не могу видеть, что в коде. Вы должны опубликовать класс 'blueViewController'. Другое дело, что вы должны всегда использовать букву Capital для имен классов как «BlueViewController». 'blueViewController' представляет имена переменных. – iDev

+1

за исключением синтаксиса, удаление self.view в методе switchViews (затем добавление subview к теперь осиротому представлению) выглядит как ошибка. – danh

+1

Только что заметил: «Мне всего 12» ... Вы пишете код в 12 лет, я готов поспорить, что вы можете справиться с множеством сложных вещей. престиж для отличного старта! :-) – danh

ответ

0

Если вы включаете заголовочные файлы, вам не нужны объявления переадресации. Таким образом, вы можете удалить:

@class searchResultsViewController; 
@class startPageViewController; 
+1

Я думаю, вы правы, что это не нужно, но могут ли они генерировать ошибку компилятора? я просто попытался добавить избыточный класс MyClass @class в MyClass.m и .h, и это не вызвало ни предупреждения компилятора, ни ошибки. – danh

+0

Вы используете объявления переадресации класса в файле интерфейса (.h), если хотите связать класс перед тем, как он был определен. Он не используется в файле реализации (.m). См. Http://stackoverflow.com/questions/3904663/what-does-class-do-in-objective-c –

+0

Да, я понимаю. И вы правильно указываете, что они посторонние в .m. Но OP пытается решить ошибку компилятора, которую я не думаю, что ваше предложение решает. (Декларации не требуются, но безвредны). – danh

3

Проблема заключается в том, что посторонние @class декларации в файле startPageViewController.m. Это скрывает полное определение, которое вы получаете от операторов #import.

Вы должны иметь только @class форвардные объявления в файле .h (как вы уже делаете).

Другое предложение. Это стандартная практика на многих языках программирования, включая Objective-C, имена классов начинаются с буквы верхнего регистра. Переменные и имена методов должны начинаться с строчных букв. Выполнение этого, наряду со всеми остальными, упрощает чтение кода.