如何从NSObject获取NSString变量值到ViewController

时间:2011-11-10 00:47:11

标签: iphone ios uitableview nsobject

我正在尝试设置一个对象来控制我的所有数据,以便它可以在后台进行设置,看起来我的tableviews加载速度比现在更快等。

这就是我想要实现的目标。

enter image description here

当我们选择tableviewcell时,我在第二个VC中设置NSObject中的变量:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Access selected cells content (cell.textLabel.text)
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    //Parent view logic (sends info back to the correct cell in parent view)
    if (parentViewSelectedIndexPath.section == 0) 
    {
        if (parentViewSelectedIndexPath.row == 0) 
        {
            //Predicates restrict the values that will be returned from the query
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MANUFACTURER",cell.textLabel.text];
            NSArray *filterArray = [myDataArray filteredArrayUsingPredicate:predicate];
            //[[self delegate] setManufactureSearchFields:filterArray withIndexPath:indexPath]; //This is where I pass the value back to the mainview
            //Using Object
            VehicleControllerNSObject *vehicleControllerNSObject = [[VehicleControllerNSObject alloc] init];
            [vehicleControllerNSObject setFirstCell:filterArray];

        }
//etc

最后,您可以看到在VechicleControllerNSObject中设置的方法,如下所示。

-(void)setFirstCell:(NSArray *)array{

    manufactureSearchObjectStringFVC = [[array valueForKey:@"MANUFACTURER"] objectAtIndex:0];
    NSLog(@"%@", manufactureSearchObjectStringFVC); // this prints the correct value to the console
}

正如您所看到的,它可以正确输出正确的输出。

但是我不知道如何调用manufactSearchObjectStringFVC并将它保存的值传递给我想在我的firstviewcontroller上传递的uitableviewcell。

这是我测试atm的原因。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    VehicleControllerNSObject *vehicleControllerNSObject = [[VehicleControllerNSObject alloc] init];
    manufactureSearchObjectString = vehicleControllerNSObject.manufactureSearchObjectStringFVC;
    NSLog(@"%@", vehicleControllerNSObject.manufactureSearchObjectStringFVC);

}

该nslog打印为空..

我有三个问题

1,如何将正确的值输入第一个值控制器。

2,我应该像这样使用viewDidAppear吗?..我想不是..我怎么能做得更好

3,你认为这是做这种事情的一种好方法,因为将来我想用NSObjectClass来解析信息,缓存等所有感觉背后留下的视图只显示数据准备好希望有助于表现..

任何帮助都会非常感激,因为我真的想学习这些东西,因为我知道这对我很重要。

2 个答案:

答案 0 :(得分:4)

您的问题非常精美,格式清晰,图表清楚,要求您进行搜索似乎很遗憾。但这是:

Search for Sharing Data between View Controllers

你会发现很多关于在视图控制器之间共享数据的讨论。

简而言之,我可以告诉你为什么你的代码不起作用。在您的tableView:didSelectRowAtIndexPath:方法中,您每次都会为(alloc/init)课程创建VehicleControllerNSObject 实例。然后返回viewDidAppear:上的第一个视图控制器,再次每次创建(alloc/init)一个全新的实例。

所以你有多个物体来来往往,它们彼此无关。这有点像在公交车站向一个人提供一些重要信息,然后随意挑选其他人并尝试从她那里检索相同的信息。

所以一个简单的想法就是只创建一次VehicleControllerNSObject的实例(只是旁边,这对于一个类来说有点奇怪的名称,因为通常所有objective-c个对象都是{NSObject的后代。无论如何。我只是暂时称之为VehicleController

因此,假设您想要VehicleController的'sharedInstance'。您可以向VehicleController添加一个类方法,为您提供一种轻松获取sharedInstance的方法:

+(VehicleController*)sharedInstance {

    static VehicleController *sharedInstance_ = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        sharedInstance_ = [[VehicleController alloc] init];
    });

    return sharedInstance_;
}

因此,要在其他类的方法中获取该实例,您可以执行以下操作:

VehicleController *sharedController = [VehicleController sharedInstance];
sharedController.someProperty = someValue;

// and then back in your first view controller, similarly:
VehicleController *sharedController = [VehicleController sharedInstance];
id someValue = sharedController.someProperty;

再次检查搜索,很多人对此进行了很好的讨论。这只是一种方法。我希望至少为什么你的代码不起作用是有道理的。

希望有所帮助。

答案 1 :(得分:1)

回答问题3.否。

我认为做这样的事情的最好方法是使用Core Data和它的NSManagedObject。

UITableViewController和NSFetchedResultsController的组合,从Core Data sqlite后备存储中提供,如果设置良好,将提供并保持UITableView更新。

在这里描述一切都是很久的。所以我会在那里停下来。

如果您不想这样做,总是可以使用共享指向可变对象或使用singleton对象在UIViewController之间传递信息。