Передача NSString из одного представления в другое

У меня есть 2 представления, которые используют одни и те же файлы классов (.h и .m). В первом представлении у меня есть UIPicker со списком элементов и кнопкой. Если пользователь нажимает кнопку, я хочу, чтобы мое второе представление показало соответствующее изображение (на основе элемента, выбранного в UIPicker).

Я думал, что нужно установить NSString в первом представлении на основе выбранного элемента. Затем, когда пользователь нажимает кнопку для вывода второго представления на экран, я могу передать эту строку с новым представлением. Некоторое время я "гуглил", но, кажется, не могу обхватить его пальцем. Если это важно, я использую контроллер навигации. Вот код, который выполняется при нажатии кнопки:

-(IBAction) viewPictures{
     ViewControllerClass *sView = [[ViewControllerClass alloc] initWithNibName:@"ViewController2XIB" bundle:nil];
     [self.navigationController pushViewController:sView animated:YES];
}

person Brian    schedule 03.01.2011    source источник


Ответы (2)


Вы можете либо добавить свойство NSString * в ViewControllerClass и установить его после его инициализации (это было бы проще всего), либо вы можете создать свой собственный метод инициализации, который берет строку и устанавливает ее там.

Вариант 1:

(поместите это в свой файл .h)

@interface ViewControllerClass : UIViewController {
  NSString *someString;
}

@property (nonatomic, copy) NSString *someString;

@end

(Тогда в вашем .m файле)

@implementation ViewControllerClass
@synthesize someString;
@end

Измените свой код сверху на это:

-(IBAction) viewPictures{
     ViewControllerClass *sView = [[ViewControllerClass alloc] initWithNibName:@"ViewController2XIB" bundle:nil];
     sView.someString = @"Whatever String you want";
     [self.navigationController pushViewController:sView animated:YES];
}

Вариант 2:

(поместите это в свой файл .h)

@interface ViewControllerClass : UIViewController {
  NSString *someString;
}

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle someString:(NSString *)SomeString;

@end

(Тогда в вашем .m файле)

@implementation ViewControllerClass

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle someString:(NSString *)SomeString
{
  if(self = [super initWithNibName:nibName bundle:nibBundle]) {
    someString = [SomeString copy];
  }
  return self;
}

@end

Измените свой код сверху на это:

-(IBAction) viewPictures{
     ViewControllerClass *sView = [[ViewControllerClass alloc] initWithNibName:@"ViewController2XIB" bundle:nil someString:@"Whatever String you want"];
     [self.navigationController pushViewController:sView animated:YES];
}
person theChrisKent    schedule 03.01.2011
comment
Вы имеете в виду, что в файле .h добавьте: NSString * string1; а затем добавить @property (неатомарный, сохранить) NSString * string1; Я пробовал это, но это не сработало. Я предполагаю, что он освобождается, когда первое представление закрывается и загружается второе представление. Если бы вы могли показать мне несколько фрагментов кода, я был бы признателен. Я не слишком разбираюсь в программировании в целом. Спасибо за ответ. - person Brian; 04.01.2011
comment
Большое спасибо. Я просто забыл установить его в своем методе IBAction. Спасибо за помощь. - person Brian; 04.01.2011

Поместите NSString в .m, который разделяет эти 2 представления, как сказал Крис. В методе, который реагирует на нажатие кнопки, передайте строку из uipicker в созданный вами NSString, а затем передайте ее представлению 2.

person Bruno Domingues    schedule 03.01.2011