Как передать переменные между двумя контроллерами представления - PullRequest
1 голос
/ 10 июля 2011

Теперь у меня есть 2 контроллера представления, и оба получили табличные представления.Когда я выбираю строку во втором табличном представлении (используя didSelectRowAtIndexPath),

и хочу передать информацию, полученную во втором представлении, в первое представление, я попытался использовать делегат и протокол, но не знаю почему, Это не сработало.

И я попытался использовать метод класса внутри первого класса, когда я получил переменную в втором представлении, вызов метода класса внутри первого класса.Переменная успешно передается первому представлению,

, но когда я хочу установить текст метки, она все равно не удалась ..

Может кто-нибудь научить меня, как это сделать?спасибо!


Мой протокол и делегат.

Это второе представление.

@protocol CategoriesViewControllerDelegate;
@interface CategoriesViewController : UIViewController {
    TableViewNewAppDelegate *appDelegate;
    id <CategoriesViewControllerDelegate> delegate;

}
@property (nonatomic, assign) id <CategoriesViewControllerDelegate> delegate;
@end

@protocol CategoriesViewControllerDelegate <NSObject>

-(void)backstring:(NSString *)String;

@end

В файле .m синтезируйте его

@implementation CategoriesViewController
@synthesize delegate;

didSelectRowAtindexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    CategoryData *CateObj = [appDelegate.CateArray objectAtIndex:indexPath.row];
    NSString *Strings = [NSString stringWithString:CateObj.CateTitle];
    [delegate backstring:Strings];

    [self.parentViewController dismissModalViewControllerAnimated:YES];

}

В первом представлении .h файл контроллера.

#import "CategoriesViewController.h"
@interface DataController : UIViewController <CategoriesViewControllerDelegate>{

.m файл

-(void)backstring:(NSString *)String {
    NSLog(@"%@",String);
    jCateField.text = String;
}

Это то, как я делаюмой протокол + делегат.Что-то не так?

Кстати, я создал метод Class в первом контроллере представления и использую метод Class в контроллере второго представления, он успешно передает переменную первому контроллеру представления.

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

Ответы [ 5 ]

1 голос
/ 10 июля 2011

Код, который вы указали, кажется правильным.В вашем случае вы должны установить:

@property (nonatomic, assign) id <CategoriesViewControllerDelegate> delegate;

правильно, чтобы указать на первый контроллер представления, который соответствует протоколу, который вы определили:

#import "CategoriesViewController.h"
@interface DataController : UIViewController <CategoriesViewControllerDelegate>{

Так что, кажется, вы нажали CategoriesViewController на первый DataController, вы, вероятно, пропустили это прямо перед этим.

// self is the first view controller
// [myCategoriesViewController setDelegate:self]; old fashion
myCategoriesViewController.delegate = self;
[self presentModalViewController:myCategoriesViewController animated:YES];

Возможно, это решит вашу проблему.Надеюсь это поможет.Также рассмотрите возможность, чтобы первый контроллер отклонил второй. Здесь - ссылка на документацию Apple.

1 голос
/ 10 июля 2011

Вы можете просто передать информацию прямо на ваш второй контроллер представления;

SecondViewController.h

@interface SecondViewController
{
    Information *info;
}

@property (nonatomic, retain) Information *info;

@end

SecondViewController.m

@implementation SecondViewController

@synthesize info;
...

@end

И в вашемМетод didSelectRowAtIndexPath;

SecondViewController *controller = [[SecondViewController alloc] initWithNibNamed:@"SecondViewController" bundle:nil];
[controller setInfo:YOUR_INFO_OBJECT];

[self.navigationController pushViewController:controller animated:YES];
[controller release];
0 голосов
/ 10 июля 2011

Можете ли вы опубликовать код для того, чтобы показать, что вы отображаете содержимое, когда возвращаетесь к контроллеру 1-го представления. Как здесь, если журнал дает вам правильное значение, проблема заключается в соединении (если оно берется через iboutlet) или с addubview. Вы получаете ноль в метке или нет значения (метка скрыта).

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

Просмотр контроллеров объектов. У объектов могут быть методы, которые можно вызывать из других объектов, и они могут иметь переменные экземпляра. («Делегат» - это просто причудливый термин для этого.)

Нет внутренней причины, по которой передача данных между контроллерами представления должна быть сложной или сложной, если у вызывающей стороны есть адрес вызываемой стороны. (И не имеет значения, имеет ли данный VC XIB.)

Похоже, ваша настоящая проблема - не знать, что делать с данными после их передачи вызываемому абоненту.

Глупый вопрос: действительно ли jCateField связан с меткой, которую вы хотите изменить, или это ноль? Если вы создали метку из кода (поскольку у вас нет XIB), вам нужно будет сохранить адрес созданной метки в jCateField во время создания представления.

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

Импортировать файл заголовка контроллера второго представления в файл реализации контроллера первого представления. Импортируйте файл заголовка контроллера первого вида в файл заголовка контроллера второго вида. Создайте свойство (текст / метка / что угодно) в первом контроллере представления. Создайте свойство первого контроллера представления во втором контроллере представления. Создайте второй экземпляр контроллера представления, установите для свойства первого контроллера представления то, что вам нужно, передайте контроллер в контроллер навигации. Во втором представлении контроллер измените все, что вы хотите в первом представлении контроллера. Методы экземпляра разрешены. Не забудьте освободить контроллер первого вида.

Шаблон делегата тоже работает таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...