2013-02-25 6 views
0

Im пытается получить текущий заголовок из UIButton, объявленного в UIViewController.m, сохранить его в NSString, а затем передать его контроллеру UITableView, чтобы использовать его в качестве параметра для NSFetchRequest.Передача переменной NSString из UIView в UITableView

MainMenuViewController.h

- (IBAction)salesMan:(UIButton *)sender; 
    @property (nonatomic,strong) NSString *bPerson; 

MainMenuViewController.m

#import "MainMenuViewController.h" 
    #import "DisplayResultsViewController.h" 

    // more code here... 

    - (IBAction)salesMan:(UIButton *)sender { 

     self.bPerson = sender.currentTitle; 
    } 
    @end 

DisplayResultsViewController.h

@property (nonatomic, strong) NSString *sPerson; 

DisplayResultsViewController.m

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
     context = [appDelegate managedObjectContext]; 

     MainMenuViewController *mainMenu = [[MainMenuViewController alloc]init]; 

     self.sPerson = mainMenu.bPerson; 
     NSLog(@" %@", self.sPerson); 

    } 

Проблема заключается в том, что она не передавая переменная NSLog возвращает "нуль"

+1

Это ортогонально вашему вопросу, но, следуя лучшим рекомендациям MVC, вы не должны смешивать свою модель с вашим видом. I.e., вы устанавливаете свойство bPerson (вашу модель) из названия вашей кнопки (ваш вид). – memmons

+0

Итак, что бы вы предложили, чтобы получить заголовок из UIButton и передать его как NSString для TableViewConrtoller, чтобы его можно было использовать в качестве параметра для предиката? Это идея: Пользователь нажимает кнопку-название отправляется в контроллер табличного представления для предикатного параметра-TableViewController отображает запрос на выборку на основе нажатой кнопки. – Ray

+0

Что представляет название кнопки? Что-то в вашей модели, я предполагаю. Обычно вы хотите сохранить свою модель в качестве свойства на вашем контроллере представления и ссылаться на модель, чтобы значения передавались другим контроллерам (или передавали всю модель). В Стэнфордском университете есть несколько суперсовременных курсов по развитию iOS, доступных бесплатно в iTunes U: https://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255?mt=10. Первый, ** MVC и Введение в Objective-C ** должны обеспечить хороший контекст. – memmons

ответ

3

MainMenuViewController * MainMenu = [[MainMenuViewController Alloc] инициализации];

Новый экземпляр создается в строке выше вызов, MainMenu является alloc ованными и init ialised со значениями по умолчанию.

self.sPerson = mainMenu.bPerson;

self.sPerson установлено значение от начального значения по умолчанию mainMenu.bPerson !!!

NSLog (@ "% @", self.sPerson);

Как ожидается, значение null будет напечатано, поскольку значение не установлено.

Возможное решение:

Вы можете использовать любой из следующих действий:

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

+0

Итак, что бы вы предложили, чтобы получить название из UIButton и передать его как NSString для TableViewConrtoller, чтобы его можно было использовать в качестве параметра для предиката? Это идея: пользователь нажимает кнопку-название отправляется в контроллер табличного представления для предикатного параметра-TableViewController отображает запрос на выборку на основе нажатой кнопки – Ray

+0

статический или как аргумент –

0

Одно из возможных решений (не лучший)

В AppDelegate.h (переехал из MainMenuViewController.h)

@property (nonatomic,strong) NSString *bPerson; 

В MainMenuViewController.m

- (IBAction)salesMan:(UIButton *)sender { 
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
     [appDelegate setBPerson:sender.currentTitle]; 
    } 

В DisplayResultsViewController.м

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
     context = [appDelegate managedObjectContext]; 

     MainMenuViewController *mainMenu = [[MainMenuViewController alloc]init]; 

     self.sPerson = [appDelegate bPerson]; 
     NSLog(@" %@", self.sPerson); 

    } 
+0

Спасибо, что я тоже попробую – Ray

0

Я не уверен, если вы используете SEGUE и толкая DisplayResultsViewController, но в вашей подготовке к методу SEGUE на MainMenuViewController вы можете получить экземпляр контроллера вида назначения, который будет DisplayResultsViewController и установить sPerson имущество:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    DisplayResultsViewController *drvc = (DisplayResultsViewController *)[segue destinationViewController]; 
    drvc.sPerson = self.bPerson 
} 

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

+0

Я понял вне !! Я использовал ctrl-drag segue в своей доске объявлений, и prepareforsegue запускался до того, как didselectrow присвоил значение переменной. Я должен был перейти на ручной segue из didselectrow и присвоить значение переменной перед тем, как начать игру. Это был вопрос последовательности. – Ray

+0

Лично, когда я использую segues, я даже не использую didselectrow. Надеюсь, мой ответ был полезен. – Mike