无法从另一个viewController访问变量

时间:2012-07-23 05:02:29

标签: objective-c ios xcode

这是一个非常简单的问题,对于我的生活,我无法弄清楚为什么这不起作用。所以,如果这是一个愚蠢的问题,我很抱歉,但请光临我。

我有一个名为“setTimeViewController”的viewController。我有另一个名为“setEventViewController”的视图控制器。用户在setTimeViewController中的表中点击一行,并发送到仅包含UIPickerView和保存按钮的setEventViewController。当用户点击保存按钮时,它会将它们带回setTimeViewController。

我想从setEventViewController中选择的那个选择器中的值能够从setTimeViewController访问但是返回(null)给我。我在.h setEventViewController中声明了一个NSString * theVariable,它是我试图从另一个视图控制器检索的变量,并保留了它的属性,但它仍然是null。

我已经在setEventViewController中的viewDidDisappear中完成了一个测试(NSLog变量),看看当视图消失但它是否正常工作时它是否为null。

这是我的代码,如果有人可以帮助我,我将永远感激。谢谢!

setEventViewController.m

- (void)pickerView:(UIPickerView *)pickerView 
  didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

theVariable= [currentItemsInPicker objectAtIndex:row];  
//[theVariable retain]; //Tried this as well but did not work
} 

-(IBAction) Save
{
//simply dismisses the view controller back to setTimeViewController. Have also tried to   set another NSString equal to theVariable but this did not work.
[self.navigationController popViewControllerAnimated:YES];
}

setTimeViewController

 -(void) retrieveTheEvent
 {
  setEventViewController *eventViewController= [[setEventViewController alloc] init];
  NSString *testString= eventViewController.theVariable;

  NSLog (@"the event is %@", testString); //shows null
  }

5 个答案:

答案 0 :(得分:3)

如果我没有错,你在retrieveTheEvent中分配setEventViewController的不同对象。您正面临这个问题,因为这个新分配的对象与您推送的对象不同。

而不是使用推送到导航控制器的同一个对象。

一个解决方案: 创建全局对象你的setEventViewController(即我的意思是为它创建iVar)并使用相同的引用来推送didSelectRow中的视图控制器。并使用相同的iVar访问theVariable。

在setTimeViewController.h中添加以下代码

setEventViewController *eventViewController;  

请为它创建属性。

现在在setTimeViewController.m中 现在使用setEventViewController的现有引用来推送视图控制器。像

eventViewController= [[setEventViewController alloc] init];
[self.navigationController pushViewController: eventViewController animated:YES]; 

更改此方法
-(void)retrieveTheEvent  {   NSString *testString= eventViewController.theVariable;   NSLog (@"the event is %@", testString); //shows null   }

答案 1 :(得分:1)

为Armaan的名单添加另一个解决方案。

在setEventViewController.m中创建一个委托,并在调用之前将“theVariable”传递给setTimeViewController.m

[self.navigationController popViewControllerAnimated:YES];

答案 2 :(得分:1)

我举了一个例子。

<强> setEventViewController.h

@protocol setEventViewControllerDelegate;

@interface setEventViewController : UIViewController 
{
    NSString* theVariable;
    id<setEventViewControllerDelegate> delegate;
}    
@end

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end

<强> setEventViewController.m

@synthesize delegate;

- (void)pickerView:(UIPickerView *)pickerView 
  didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{    
    theVariable= [currentItemsInPicker objectAtIndex:row];

    // this is where the new value is passed to setTimeViewController
    if(delegate && [delegate respondsToSelector:@selector(theVariableChanged)])
    {
        [delegate theVariableChanged:theVariable];
    }
} 

-(IBAction) Save
{
    [self.navigationController popViewControllerAnimated:YES];
}

-(void) dealloc
{
    // very important
    self.delegate = nil;
}

<强> setTimeViewController.h

#import "setEventViewController.h"

@interface setTimeViewController : UIViewController <setEventViewControllerDelegate>
{
// your members
}
@end

<强> setTimeViewController.m

-(void)openSetEventView
{
    setEventViewController *eventViewController= [[setEventViewController alloc] init];

    // set the delegate
    eventViewController.delegate = self;
    [self.navigationController pushViewController: eventViewController animated:YES];
    [eventViewController release];
}

// get the new value here
-(void)theVariableChanged:(NSString*)theNewValue
{
      NSLog (@"the event is %@", theNewValue);
}

答案 3 :(得分:1)

查看单身人士,

在做这样的事情时,他们可能是你最好的朋友。

Singletons link here

答案 4 :(得分:0)

我尝试了所有不同的建议,将NSString从一个viewController传递到另一个,包括客户初始化方法,并将属性更改为strong,remaining,它们都不适合我。

最后,在项目中共享数据的单例解决了该问题。 http://www.galloway.me.uk/tutorials/singleton-classes/

感谢@David Evans