у меня проблемы с Xcode; по какой-то причине он просто не позволяет мне передавать переменную из одного класса контроллера представления в другой. Он должен работать, я в основном просто копировал / вставлял из других моих классов (он работает на всех из них ... кроме этого). Я был в этом всю ночь, перепробовал все, что мог придумать, и все еще остается.
Вот класс контроллера представления, в котором я звоню:
#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*
#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];
}
}
А вот другой класс, в который я хочу отправить массив:
#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, вы называете его ... у меня нет трюков :(





Просто предположение, но пробовали ли вы использовать оператор стрелки -> вместо оператора точки .?
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:
Создайте инициализатор во втором контроллере представления. Бывший:
-(id)initWithResultsArray: (NSArray *) resultsArray;
Создайте переменную для хранения массива. Скажите myResultsArray.
Внутри метода initWithResultsArray сохраните значение resultsArray в myResultsArray.
Инициализируйте SecondViewController, используя initWithResultsArray вместо init.
Представьте свой контроллер как обычно, вы сможете работать с myResultsArray.
Надеюсь это поможет.
Моника ツ
Вы можете получить более качественные ответы, если измените заголовок на более информативный. например «Невозможно передать переменные между контроллерами в проекте iPhone»