Objective C从其他类访问变量?

时间:2012-03-01 08:08:16

标签: iphone objective-c variables

我正在尝试从我从表视图中创建的类中获取变量。基本上我想要做的是告诉另一个控制器选择了哪一行,所以这就是我试图做的。

表视图类.h文件:

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

然后我会创建在Table View类的.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)
}

那个类的所有内容,现在是我需要值的类 查看通过segue推送的控制器类.h

@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);

由于某些原因,这不起作用......当我在“didselectrow”方法中打印出“itemId”时,它会返回正确的数字但是当我尝试在另一个类中打印出它时,它只是给了我' 0' 有什么想法吗? 如果我想在我的代码中看到我遗漏的东西,我会非常乐意写出来:)我只是想通过减少代码来节省时间和空间。 提前谢谢!

编辑: 我找到了一个可能的解决方案,但它涉及使用委托。我确信必须有更好的方法来做到这一点,如果你有任何想法,请告诉我。

6 个答案:

答案 0 :(得分:2)

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

在您创建的另一个类中执行此操作并初始化新对象,因此它将为nill(对于int 0)。要在类和视图控制器之间共享数据,请使用委托和属性。 用一些代码我会解释;

#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);

    }

答案 1 :(得分:0)

未调用- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) - 您必须选择一行来更改itemId的值,而这在表的初始化和itemId = [tvc itemId];行之间是不可能的。

答案 2 :(得分:0)

试试这个:

@property  NSInteger itemId;

希望这有助于你

答案 3 :(得分:0)

此代码可能会对您有所帮助。

#import <UIKit/UIKit.h>

extern int outsider;

@interface ViewController : UIViewController {

}

@property int outsider;

@end

到#import你声明变量的.h文件的所有.m文件都可以访问它。

答案 4 :(得分:0)

您正在详细视图控制器中创建表视图控制器的新实例,这是不正确的,并且不会为您提供对原始表的引用。

只需在推送的视图控制器上创建一个属性,该属性包含您想要传递的任何详细信息。然后在表视图控制器的prepareForSegue:中设置它,segue.destinationViewController将为您提供指向即将出现的VC的指针。

另外,按照Yuji在评论中的建议修复您的访问者方法。

答案 5 :(得分:0)

我建议在单例中保存压缩行的indexPath。以下是有关如何使用singleton class存储对象并在各个类中使用它们的指南。

在此示例中,您还可以在单​​例中声明一个实例变量,并在 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;
}

在您的视图中,使用UITableView的控制器就是这样:

@implementation

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

tableViewPath = indexPath;

}

您应该将初始化调整为适合您特定程序的初始化!