2013-06-28 2 views
0

Я новичок в разработке iOS, и я немного в тупике. Было бы здорово, если бы кто-нибудь мог мне помочь.Изменение значения свойства другого UIViewController

У меня есть один UIViewController с кучей кнопок. Предполагается, что эти кнопки устанавливают значение для второго UIViewcontroller, в зависимости от того, на какой вы нажимаете. Например, второй UIViewController имеет свойство типа NSString. Когда я нажимаю кнопку в первом контроллере представления (скажем, «Банана»), я хочу, чтобы NSString второго UIViewController присвоил ему «Банана». Или когда я нажимаю кнопку Apple, NSString теперь назначается «Apple».

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

Я надеюсь, что это ясно. Я просто хочу знать синтаксис в первом UIViewController, чтобы присвоить значение другому свойству UIViewController, например NSString. Я бы очень признателен за любую помощь.

+0

Вы используете StoryBoard и хотите передавать данные через segue? Если да, есть много таких вопросов и множество ответов ... – Larme

+1

Как я уже упоминал в вопросе, два контроллера НЕ подключены посредством segue. –

ответ

0

Возможно, SecondViewController является свойством FirstViewController. Таким образом, FirstViewController может ссылаться на него.

EDITED чтобы ответить на вопрос в комментарии

Свойство Пример:

@interface FirstViewController() 
property (strong, nonatomic) SecondViewController *secondViewController; 
@end 

@implementation FirstViewController 

-(id)init 
{ 
    if (self = [super init]) { 
     self.secondViewController = [[SecondViewController alloc] init]; 
    } 
    return self; 
} 

-(void)didPressBanana 
{ 
    [self.secondViewController bananaWasPressed]; 

    // OR 

    self.secondViewController.fruit = @"banana"; 
} 

@end 

SecondViewController.h

@interface SecondViewController 

@property (strong, nonatomic) NSString *fruit; 

@end 

ИЛИ

Se condViewController.m

-(void)bananaWasPressed 
{ 
    self.fruit = @"banana"; 
} 

Или же вы можете использовать протоколы, если вы хотите, чтобы пойти другим путем и иметь SecondViewController общаться назад к FirstViewController.

Протокол Пример:

SecondViewController.h

@protocol SecondViewControllerDelegate 
-(void)didPressBanana; 
@end 

@interface SecondViewController : UIViewController 
    @property (nonatomic, unsafe_unretained) id<SecondViewControllerDelegate> delegate; 
@end 

SecondViewController.m

-(void)didPressBanana 
{ 
    [self.delegate didPressBanana]; 
} 

FirstViewController.m

@interface FirstViewController() 
@property (nonatomic, strong) SecondViewController *secondViewController; 
@end 

@implementation FirstViewController <SecondViewControllerDelegate> 

-(id)init 
{ 
    if (self = [super init]) { 
     self.secondViewController = [[SecondViewController alloc] init]; 
    } 
    return self; 
} 
-(void)viewDidLoad 
{ 
    [self.secondViewController setDelegate:self]; 
} 

// delegate method conforms to SecondViewControllerDelegate protocol 
-(void)didPressBanana 
{ 
    // do something 
} 

@end 
+0

Спасибо, что ответили. Это выглядит как отличный код, но просто быстрое уточнение: в примере свойств может ли первый контроллер представления назначить значение для свойства во втором контроллере представления? Итак, если второй контроллер представления имеет NSString «Fruit», может ли первый контроллер представления назначить «Банану» этому NSString? И что еще более важно, если пользователь открывает второй контроллер представления, будет ли он иметь банан в качестве Fruit NSString? –

+0

Извините за длинный вопрос, я просто хочу убедиться, что я делаю это правильно :) –

+0

Да, если свойство Fruit определено в файле .h файла SecondViewController, или вы можете выполнить назначение в методе bananaWressPressed в SecondViewController. Я обновлю свое сообщение, чтобы отразить эту функциональность. –

0

Если первый UIViewController не имеет ссылки на второй UIViewController, вы можете использовать одномодовый объект модели, который обновляется первым UIViewController и считывается вторым UIViewController. Вот хорошая ссылка для создания синглтона: http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html

0

Либо сделать secondViewController как Родитель View Controller из FirstViewController, в этом случае вы можете получить доступ всех свойств родительского View Controller или Используйте NSNotificationCenter отправить уведомление от первого Посмотреть Contrlller к Во-вторых.

ParentViewController.h

#import <UIKit/UIKit.h> 

@interface ParentViewController : UIViewController 

@property (nonatomic,strong) NSString *mytextView; 

@end 

ChildViewController.h

#import "ParentViewController.h" 

@interface ChildViewController : ParentViewController 

@end 

ChildViewController.m

#import "ChildViewController.h" 

@interface ChildViewController() 

@end 

@implementation ChildViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.mytextView = @"Value"; 
} 
+0

К сожалению, я не могу выполнить настройку этого конкретного проекта, чтобы один из классов являлся родителем другого. Тем не менее, я ценю продуманный ответ. Спасибо! –

+0

Затем используйте NSNotificationCenter..это самое простое решение вашей проблемы ... –

+0

Спасибо! Я попробую это тоже –

Смежные вопросы