1

我目前正在尝试开发一个 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,以及重新启动计算机。我也试图“清理”这个项目。

我的头发部分将不胜感激任何帮助,但尚未感到沮丧。

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

约翰·阿比尔兹科夫

4

4 回答 4

1

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

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

于 2012-06-11T09:55:19.830 回答
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

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

于 2012-06-11T08:47:28.110 回答
0

Just in case anyone else is suffering from this weird problem as I just did - the cause in my case was due to my ending up with 2 copies of the same class .m & .h files in different directories of my project after my Xcode newbie fumbling attempt to move them from one disk directory to another while keeping them in the same Xcode group. Xcode ended up allowing me to edit one set of files but used the other for compilation so the method that I added really didn't exist as far as the compiler was concerned, hence the above error message.

于 2013-06-04T15:33:49.080 回答
0

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

于 2013-03-14T18:48:12.370 回答