iOS:ViewController子类的方法在其他类中不可见

时间:2012-06-11 08:40:24

标签: objective-c ios uiviewcontroller scope subclass

我目前正在尝试开发iPhone应用程序。 大多数事情都按照我的预期和喜好运作。

现在我遇到的问题是,当我向其中一个ViewControllers添加方法时,从我的应用程序的其他部分看不到这些方法。

当我添加相同的方法时,与我的其他视图控制器具有相同的签名,它们将是可见的。

我用谷歌搜索,浏览stackoverflow,重读,复制/粘贴,并向意大利面怪物祈祷,以获得神圣的洞察力,但无济于事。

必须有一些细微的细节,我在我的愚蠢中俯视。我希望你能帮助我!

InfoPageViewController.h

#import <UIKit/UIKit.h>
#import "DB.h"

@interface InfoPageViewController : UIViewController
{
    IBOutlet UIWebView* wv;
    DB* db;
}

@property (retain, nonatomic) IBOutlet UIWebView* wv;

-(void) reloadInfoPage;
@end

InfoPageViewController.m

#import "InfoPageViewController.h"
@interface InfoPageViewController ()

@end


 @implementation InfoPageViewController
 @synthesize wv;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"Information", @"Information");
        self.tabBarItem.image = [UIImage imageNamed:@"TabIcon-Settings"];
        db = [[DB alloc] init];

        // Custom initialization
    }

    return self;
}

- (void)viewDidLoad
{
   [super viewDidLoad];
   // Do any additional setup after loading the view from its nib.    

   DBInfoPage* dbip = [db getInfopage];
   [wv loadHTMLString:dbip.html baseURL:nil];
   //NSLog(@"word%@", dbip.html);
   [self reloadInfoPage];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

-(void)reloadInfoPage
{
    DBInfoPage* dbip = [db getInfopage];
    [wv loadHTMLString:dbip.html baseURL:nil];
    NSLog(@"reloading infopage%@", @"");
}

@end

infoviewtest.h

#import <UIKit/UIKit.h>
#import "InfoPageViewController.h"
@interface infoviewtest : NSObject

@end

infoviewtest.m

#import "infoviewtest.h"

@implementation infoviewtest
-(void)test
{
    InfoPageViewController* ivc = [[InfoPageViewController alloc] init];
    [ivc reloadInfoPage];
}
@end

这会产生一个错误:“InfoPageViewController'没有可见的@interface'声明选择器'reloadInfoPage'。

我还尝试使用自动完成功能向我展示'InfoPageViewController'的可用方法,这会生成一个不包含'reloadInfoPage'的列表,类似地,实例变量'wv'在类的范围之外是不可见的

我尝试关闭并重新打开xcode,以及重新启动计算机。 我也试图“清理”这个项目。

任何帮助都会受到我头发部分的极大赞赏,但还是没有受到挫折。

如果我一直缺乏提供信息,请提出要求,我会尽力回复。

Johan Abildskov

4 个答案:

答案 0 :(得分:1)

实际上你的代码看起来是正确的 - 你所要做的就是清理项目并可能重启XCode。

但您可以通过进行一些修改来优化链接/编译:

<强> infoviewtest.h

#import <UIKit/UIKit.h>
//@class InfoPageViewController;  //add this if you'll be adding ivar or property of this type
@interface infoviewtest : NSObject

@end

<强> infoviewtest.m

#import "infoviewtest.h"
#import "InfoPageViewController.h" //here's the place to import other headers

@implementation infoviewtest
-(void)test
{
    InfoPageViewController* ivc = [[InfoPageViewController alloc] init];
    [ivc reloadInfoPage];
}
@end

编辑:确保数据库类的实施是正确的。 XCode错误可能会导致错误的假设。再说一遍:您发布的代码似乎是正确的,只是没有针对编译进行优化。

答案 1 :(得分:1)

我注意到测试目标存在一个奇怪的问题,当你在测试目标中没有包含一个仍然可以编译的类时,这可能会发生在这里:

您是否在测试目标中包含 InfoPageViewController

答案 2 :(得分:0)

您的代码似乎很完美。即使DB.h具有相同的方法名称,也不会影响控制器类中相同方法的声明。这很奇怪的错误。可能你的XCode可能已损坏。尝试更新Xcode并尝试相同的代码。如果您要更新Xcode,也请更新iTunes。这可能会解决我的问题。

答案 3 :(得分:0)

以防其他人像我刚才那样患上这个奇怪的问题 - 我的案例的原因是由于我最终得到同一类的两份副本.m&amp;我的项目的不同目录中的.h文件在我的Xcode新手摸索尝试将它们从一个磁盘目录移动到另一个磁盘目录同时保持它们在同一个Xcode组中之后。 Xcode最终允许我编辑一组文件但是使用另一组文件进行编译,所以我添加的方法实际上并不存在编译器所涉及的,因此上面的错误消息。