1

私は現在、iPhoneアプリケーションを開発しようとしています。ほとんどのことは、私が期待し、好むように機能しています。

現在私が抱えている問題は、ViewControllers の 1 つにメソッドを追加すると、メソッドがアプリケーションの他の部分から見えないことです。

同じメソッドを同じ署名で他のView Controllerに追加すると、それらが表示されます。

私はグーグルで検索し、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

実際、あなたのコードは正しいように見えます - あなたがしなければならないことは、おそらくプロジェクトをきれいにして、おそらく 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 に答える
1

テスト ターゲットに奇妙な問題があることに気付きました。テスト ターゲットにクラスを含めない場合でもコンパイルされます。これは、ここで起こっている可能性があります。

テスト ターゲットにInfoPageViewControllerを含めましたか?

于 2012-06-11T09:55:19.830 に答える
0

ちょうど私がしたように、他の誰かがこの奇妙な問題に苦しんでいる場合に備えて-私の場合の原因は、Xcode初心者の後にプロジェクトの異なるディレクトリに同じクラスの.mおよび.hファイルの2つのコピーができたためでしたそれらを同じXcodeグループに保持しながら、あるディスクディレクトリから別のディスクディレクトリに移動しようとする手探りの試み。Xcode はファイルの 1 つのセットを編集できるようになりましたが、コンパイルにはもう一方を使用したため、コンパイラに関する限り、追加したメソッドは実際には存在しなかったため、上記のエラー メッセージが表示されました。

于 2013-06-04T15:33:49.080 に答える
0

あなたのコードは完璧です。同じメソッド名を持つ DB.h であっても、コントローラ クラスでの同じメソッドの宣言には影響しません。その非常に奇妙なエラーです。おそらく、XCode が破損する可能性があります。Xcode を更新して、同じコードを試してみてください。Xcode を更新する場合は、iTunes も更新します。これで問題が解決するかもしれません。

于 2013-03-14T18:48:12.370 に答える