Как передать переменные между контроллерами представления? - PullRequest
4 голосов
/ 20 декабря 2008

мне трудно с 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 для этого класса; в этом случае просто спросите.

Заранее спасибо, Hal

PS: пробовал с другими переменными (тоже других типов), очищал / перестраивал, воссоздавал xib-файл, вы называете его ... я не в фокусе:

Ответы [ 6 ]

4 голосов
/ 20 декабря 2008

Прежде всего, не используйте -> - это прямой доступ к переменной экземпляра. Это может работать, но вы изменяете переменные экземпляра другого объекта без его ведома, что просто вызывает проблемы.

И нет, Адам Розенфилд не имел в виду dvc->array_resultados; он имел в виду resultadosControllerCell->array_resultados, то, что он сказал, и что он основывался на том, что вы сказали.

Правильное решение - это сочетание вашей исходной строки и вашей редакции строки Адама:

dvc.array_resultados = [self array_resultados];

Это относится к свойству, которое вы объявили в классе DetalhesViewController.

Говоря об этом, вы должны объявить это свойство как copy, а не retain. В противном случае вы обнаружите, что у вас есть чей-то изменяемый массив, который они затем модифицируют - более плохое моджо.

3 голосов
/ 20 декабря 2008

Это не совсем ответ на ваш вопрос, но ваше управление памятью немного шатко. Эта строка:

[dvc dealloc];

должно читаться так:

[dvc release];
dvc = nil;

В Какао, вы никогда не должны звонить dealloc напрямую - следуйте схеме retain/release/autorelease, и все будет работать лучше и по назначению.

0 голосов
/ 10 июля 2011

Пожалуйста, следуйте этим простым шагам, это должно работать.

В вашем SecondViewController:

  1. Создать инициализатор во втором контроллере вида. Пример:

    (id)initWithResultsArray: (NSArray *) resultsArray;

  2. Создать переменную для хранения массива. Скажите myResultsArray.

  3. В методе initWithResultsArray сохраните значение от resultsArray до myResultsArray.

  4. Инициализируйте SecondViewController, используя initWithResultsArray вместо просто init.

  5. Представьте свой контроллер как обычно, вы сможете работать с myResultsArray.

Надеюсь, это поможет.

Моника ツ

0 голосов
/ 24 июня 2011

Более грамотный способ сделать это - отделить данные от обоих контроллеров представления в модель. У вас будет отдельный класс (NSObject) с именем ResultadoModel.h / m. Это будет одиночный файл, поэтому оба класса могут иметь доступ к одному и тому же экземпляру.

Вы бы получили доступ к массиву, выполнив что-то вроде этого (в обоих vcs):

[[[ResultadoModel sharedInstance] array_resultados] propertyOrMethod];

Вы можете искать, как создать синглтон, это очень просто и очень мощно.

0 голосов
/ 20 декабря 2008

Хорошо, у меня это было; используя дешевый трюк, чтобы показать информацию:

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];

Действительно ненавижу использовать это, но я уже опоздал на день. Я должен был доставить его вчера.

Спасибо за вашу помощь, ребята, если вам удастся найти решение, пожалуйста, дайте мне знать. Вы никогда не знаете, случится ли это снова: /

Ура!

0 голосов
/ 20 декабря 2008

Просто предположение, но вы пытались использовать оператор стрелки -> вместо оператора точки .?

resultadosControllerCell->array_resultados  = [self array_resultados];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...