2012-03-01 4 views
1

私はテーブルビューから作成したクラスから変数を取得しようとしています。基本的には、これを行うには、他のコントローラにどの行が選択されたかを伝えて、これが私がやろうとしたことです。目的他のクラスからのCアクセス変数?

表ビュークラスの.hファイルは:

@property(nonatomic) NSInteger itemId; 
-(NSInteger)itemId; 

私は、setメソッドを作成し、表ビュークラス の.mファイル内の変数になるだろう(私は、それを合成して、すべてのものをやりました私はちょうどあなたの方法)

-(NSInteger)itemId { 
return self.itemId; 
} 

そして今、表のセルが選択される方法を...示すよ

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) 
indexPath { 
NSUInteger row = [indexPath row]; 
self.itemId = row; 
//segue stuff (if you want me to include this just let me know) 
} 

ザッツそのクラスのすべてと、今私はセグエを経由して、いくつかのために

@property (nonatomic) NSInteger itemId; 

ビューコントローラクラスの.m

#import "TableViewController.h" 
//Skip a few things 
@synthesize itemId; 
//skip a few things 
-(void)viewDidLoad { 
TableViewController *tvc = [[TableViewController alloc] init]; 
itemId = [tvc itemId]; 
NSLog(@"%i", itemId); 

を押されている ビューコントローラクラスの.hの値を必要とするクラスこれはうまくいかない理由... "didselectrow"メソッドの "itemId"を印刷すると正しい番号が返されますが、他のクラスで印刷しようとすると「0」が返されます ? 私のコードで見たいと思っていたことが残っている場合、私はそれを書いて喜んでいるでしょう:)私はちょうどコードを少し切り詰めて時間と空間を節約したいと思っていました。 ありがとうございます!

EDIT: 私は可能な解決策を見つけましたが、デリゲートを使用します。私はこれを行うためのよりよい方法が必要であると確信しています。もしあなたがアイディアを持っていれば、私に知らせてください。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)
+2

テーブルビュークラスの 'itemId'ゲッターを呼び出すことはありますか?無限ループが発生することは間違いありません。 'return itemId'に変更する必要があります。 – yuji

答えて

0

が起動されていない - あなたはitemIdの値を変更する行を選択する必要があり、それはテーブルの初期化とitemId = [tvc itemId];線との間には不可能です。

0

はこれを試してみてください:

@property NSInteger itemId; 

希望これは、このコードの月があなたを助け、あなたに

0

に役立ちます。

#import <UIKit/UIKit.h> 

extern int outsider; 

@interface ViewController : UIViewController { 

} 

@property int outsider; 

@end 

すべての.mファイルに対して、#変数を宣言した.hファイルをインポートするとアクセスできます。あなたが&を作成する別のクラスでこれを行う

2
TableViewController *tvc = [[TableViewController alloc] init]; 

は、新しいオブジェクトを初期化するので、(int 0)nillとなります。クラス間でデータを共有するために、&ビューコントローラは、デリゲートとプロパティを使用します。 ちょっとしたコードを使って説明します。

#import <UIKit/UIKit.h> 

    //YourClassNameAppDelegate.m 
    @interface YourClassName : UIResponder <UIApplicationDelegate> 
    { 
     NSString *uName; 
     NSDictionary *YourDictionary; 
    } 

    @property (copy, readwrite) NSString *uName; 
    @property (copy, readwrite) NSString *YourDictionary; 

And in the other class you want to use this string and dictionary, 

    //import your delegate class 
    #import "YourClassNameAppDelegate" 
    . 
    . 
    . 
    //to me, do this in viewDidLoad(or something like that) method of new view controller 
    YourClassNameAppDelegate *sharedData= (YourClassNameAppDelegate *)([[UIApplication sharedApplication]delegate]); 
    . 
    . 
    -(IBAction)sharedData{ 
     NSLog(@"Shared String: %@\n And Shared Dictionary: %@, sharedData.uName, sharedData.YourDictionary); 

    } 
0

詳細ビューコントローラ内にテーブルビューコントローラの新しいインスタンスを作成していますが、これは間違っており、元のテーブルへの参照を与えません。

渡す詳細情報を保持するプッシュビューコントローラでプロパティを作成するだけです。次に、テーブルビューコントローラのprepareForSegue:にこれを設定します。ここでsegue.destinationViewControllerは、表示されるVCへのポインタを表示します。

また、Yujiの示唆に基づいてコメントにアクセサー方法を修正してください。

0

押された行のindexPathをシングルトンに保存することをお勧めします。 singleton classを使用してオブジェクトを格納し、クラス間でオブジェクトを使用する方法についてのガイドです。

この例では、インスタンス変数をシングルトンで宣言して、UITableViewの適切なデリゲートメソッドでその行が押されたときにインスタンス変数を設定することもできます。これには、同じように行うことができますのUITableViewを使用してビューコントローラで

#import <Foundation/Foundation.h> 
@interface Singleton : NSObject { 

NSIndexPath *tableViewPath; 

} 

#import "DataContainerSingleton.h" 
@implementation DataContainerSingleton 

@synthesize tableViewPath; 

static DataContainerSingleton* _theDataContainerSingleton = nil; 

+ (DataContainerSingleton*) theDataContainerSingleton; 
{ 
    if (!_theDataContainerSingleton) 
    _theDataContainerSingleton = [[DataContainerSingleton alloc] init]; 
    return _theDataContainerSingleton; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

      tableViewPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
    } 

    return self; 
} 

をちょうどこのようにします:

@implementation 

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

tableViewPath = indexPath; 

} 

あなたがどうなるかにあなたの初期化を調整する必要がありますあなたの特定のプログラムに適しています!

+0

'tableViewPath = indexPath'を実行すると、インポートするだけですか?または、 'DataContainerSingleton * dataContainer = [[DataContainerSingleton alloc] init];を実行する必要があります。そのクラスから変数を取得するにはgetterメソッドを使用しますか? – user1242108

+0

ああ申し訳ありませんが、私は言及dint。はい、まさにあなたがしなければならないことでしょう。このように:[DataContainerSingleton theDataContainerSingleton] .tableViewPath = indexPath; – wizH

関連する問題