我正在尝试从我从表视图中创建的类中获取变量。基本上我想要做的是告诉另一个控制器选择了哪一行,所以这就是我试图做的。
表视图类.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' 有什么想法吗? 如果我想在我的代码中看到我遗漏的东西,我会非常乐意写出来:)我只是想通过减少代码来节省时间和空间。 提前谢谢!
编辑: 我找到了一个可能的解决方案,但它涉及使用委托。我确信必须有更好的方法来做到这一点,如果你有任何想法,请告诉我。
答案 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;
}
您应该将初始化调整为适合您特定程序的初始化!