如何在视图控制器之间传递变量?

时间:2008-12-20 08:36:19

标签: objective-c cocoa-touch

我在使用Xcode时遇到了困难;出于某种原因,它只是不允许我将变量从一个视图控制器类传递给另一个视图控制器类。它应该工作,我基本上只是从我的其他类复制/粘贴(它适用于所有这些...除了这一个)。我整夜都在这里,尝试了我能想到的一切,但它仍然存在。

这是我正在进行调用的视图控制器类:

ResultadosViewController.h:

#import <UIKit/UIKit.h>
#import "Filme.h"
#import "Festival.h"
#import "Top10Discos.h"
#import "Peca.h"

@class DetalhesViewController;

@interface ResultadosViewController : UIViewController
{
    // Navegation
    DetalhesViewController *dvc;
    BOOL isViewPushed;

    // What i'd really like to pass lol
    NSArray *array_resultados;

}

@property (nonatomic, retain) NSArray *array_resultados;
@property (nonatomic, readwrite) BOOL isViewPushed;

@end*

ResultadosViewController.m:

#import "ResultadosViewController.h"
#import "DetalhesViewController.h"
#import "Filme.h"
#import "Peca.h"
#import "Top10Discos.h"
#import "Festival.h"

@implementation ResultadosViewController
@synthesize isViewPushed, array_resultados;

(...)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic -- create and push a new view controller

    if (indexPath.row == 2)
    {
        if(dvc != nil)
            [dvc dealloc];

        NSString *ffs = [[array_resultados objectAtIndex:indexPath.row] TituloFilme];

        dvc = [[DetalhesViewController alloc] initWithNibName:@"DetailedView" bundle:[NSBundle mainBundle]];

        **resultadosControllerCell.array_resultados  = [self array_resultados];** 
        *"Request for member 'array_resultados' in something not a structure or union"*

        //Push the view controller to the top of the stack.
        [self.navigationController pushViewController:dvc animated:YES];

    }
}

这是我要将数组发送到的另一个类:

DetalhesViewController.h:

#import <UIKit/UIKit.h>

#import "Filme.h"
#import "Festival.h"
#import "Top10Discos.h"
#import "Peca.h"


@interface DetalhesViewController : UIViewController
{
    // Navegacao
    NSArray *array_resultados;

}

@property (nonatomic, retain) NSArray *array_resultados;
@end

我不确定你是否有人会看到这个班级的.m文件;在这种情况下,请问。

提前致谢, 哈尔

PS:尝试过其他变量(其他类型),清理/重建,重新创建的xib文件,你给它命名......我不知所措:(

6 个答案:

答案 0 :(得分:4)

首先,不要使用-> - 这是直接的实例变量访问。它可能会起作用,但是你在不知情的情况下改变了另一个对象的实例变量,这只是在寻找麻烦。

不,亚当罗森菲尔德并不是dvc->array_resultados;他的意思是resultadosControllerCell->array_resultados,这就是他所说的,也是基于你所说的。

正确的解决方案是将原始行和Adam的行修订版混合在一起:

dvc.array_resultados = [self array_resultados];

这将通过您在DetalhesViewController类中声明的属性。

说到这一点,您应该将该属性声明为copy,而不是retain。否则,你会发现自己拿着别人的可变数组,然后他们会修改 - 更糟糕的魔法。

答案 1 :(得分:3)

这并不能解决您的问题,但您的内存管理有点不稳定。这一行:

[dvc dealloc];

应如下所示:

[dvc release];
dvc = nil;

在Cocoa中,你不应该直接打电话给dealloc - 遵循retain/release/autorelease模式,事情会更好地按照预期运作。

答案 2 :(得分:0)

只是一个猜测,但您是否尝试使用箭头操作符->而不是点运算符.

resultadosControllerCell->array_resultados  = [self array_resultados];

答案 3 :(得分:0)

好的,我已经拥有它;使用便宜的技巧来显示信息:

UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:ffs message:@"this gets covered" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    UILabel *myTextField = [[UILabel alloc] init];
    myTextField.text = @"FFS!";
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0.0, 130.0);
    [myAlertView setTransform:myTransform];

    [myTextField setBackgroundColor:[UIColor whiteColor]];
    [myAlertView addSubview:myTextField];
    [myAlertView show];
    [myAlertView release];

真的很讨厌使用它,但我已经迟到了一天。 我本应该在昨天送达。

感谢您的帮助,如果您碰巧找到了解决方案,请告诉我们。 你永远不知道它是否会再次发生:/

干杯!

答案 4 :(得分:0)

更有效的方法是将视图控制器中的数据分离到模型中。您将拥有一个名为ResultadoModel.h / m的单独类(NSObject)。这将是一个单例,因此两个类都可以访问同一个实例。

你可以通过这样做(在两个vcs中)来访问数组:

[[[ResultadoModel sharedInstance] array_resultados] propertyOrMethod];

您可以搜索如何创建单例,它非常简单且非常强大。

答案 5 :(得分:0)

请按照这些简单的步骤,它应该工作。

在SecondViewController中:

  1. 在第二个View Controller中创建初始值设定项。例如:

    - (id)initWithResultsArray: (NSArray *) resultsArray;

  2. 创建一个用于保存数组的变量。说myResultsArray

  3. initWithResultsArray方法中,将resultsArray的值保存到myResultsArray

  4. 使用SecondViewController而非initWithResultsArray初始化init

  5. 像往常一样展示您的控制器,您将能够使用myResultsArray

  6. 希望这有帮助。

    莫妮卡ツ