Как передавать переменные между контроллерами представления?

у меня проблемы с 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, вы называете его ... у меня нет трюков :(

Вы можете получить более качественные ответы, если измените заголовок на более информативный. например «Невозможно передать переменные между контроллерами в проекте iPhone»

Abizern 20.12.2008 13:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
21 212
6

Ответы 6

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

resultadosControllerCell->array_resultados  = [self array_resultados];

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

[dvc dealloc];

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

[dvc release];
dvc = nil;

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

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

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

На самом деле ненавижу это использовать, но я уже опоздал на день. Я должен был доставить его ко вчерашнему дню.

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

Ваше здоровье!

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

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

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

dvc.array_resultados = [self array_resultados];

Это проходит через свойство, которое вы объявили в классе DetalhesViewController.

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

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

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

[[[ResultadoModel sharedInstance] array_resultados] propertyOrMethod];

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

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

В вашем SecondViewController:

  1. Создайте инициализатор во втором контроллере представления. Бывший:

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

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

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

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

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

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

Моника ツ

Другие вопросы по теме