Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法从其他viewController访问变量_Objective C_Ios_Xcode - Fatal编程技术网

Objective c 无法从其他viewController访问变量

Objective c 无法从其他viewController访问变量,objective-c,ios,xcode,Objective C,Ios,Xcode,我有一个名为“setTimeViewController”的viewController。我有另一个名为“setEventViewController”的视图控制器。用户在setTimeViewController中点击表中的一行,然后被发送到setEventViewController,该控制器只包含一个UIPickerView和一个保存按钮。当用户点击save按钮时,它会将他们带回setTimeViewController 我希望从setEventViewController的选择器中选择的

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

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

我已经在setEventViewController中对ViewDidEnglish做了一个测试(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];
}
-(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);
}
setTimeViewController

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

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

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

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

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

在setTimeViewController.h中添加以下代码

setEventViewController *eventViewController;  
还请为其创建属性

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

eventViewController= [[setEventViewController alloc] init];
[self.navigationController pushViewController: eventViewController animated:YES]; 
更改此方法
-(void)retrieveTheEvent
 {
NSString*testString=eventViewController.theVariable;
NSLog(@“事件为%@”,testString);//显示null

}

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

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

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

在setTimeViewController.h中添加以下代码

setEventViewController *eventViewController;  
还请为其创建属性

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

eventViewController= [[setEventViewController alloc] init];
[self.navigationController pushViewController: eventViewController animated:YES]; 
更改此方法
-(void)retrieveTheEvent
 {
NSString*testString=eventViewController.theVariable;
NSLog(@“事件为%@”,testString);//显示null

}

将另一个解决方案添加到Arman的列表中

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

[self.navigationController popViewControllerAnimated:YES];

将另一个解决方案添加到Arman的列表中

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

[self.navigationController popViewControllerAnimated:YES];
我举个例子

setEventViewController.h

@protocol setEventViewControllerDelegate;

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

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end
#import "setEventViewController.h"

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

@protocol setEventViewControllerDelegate;

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

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end
#import "setEventViewController.h"

@interface setTimeViewController : UIViewController <setEventViewControllerDelegate>
{
// your members
}
@end
我举个例子

setEventViewController.h

@protocol setEventViewControllerDelegate;

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

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end
#import "setEventViewController.h"

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

@protocol setEventViewControllerDelegate;

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

@protocol setEventViewControllerDelegate <NSObject>    
@optional    
-(void)theVariableChanged:(NSString*)theNewValue;
@end
#import "setEventViewController.h"

@interface setTimeViewController : UIViewController <setEventViewControllerDelegate>
{
// your members
}
@end
看看单身人士

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

查看单身人士

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


我尝试了所有不同的建议,将NSString从一个viewController传递到另一个viewController,包括客户初始化方法,并将属性更改为strong、retain、non,它们中的任何一个都适用于我

最后,singleton在整个项目中共享数据解决了这个问题


感谢@David Evans

我尝试了所有不同的建议,将NSString从一个viewController传递到另一个viewController,包括客户初始化方法,并将属性更改为strong、retain和non,它们中的任何一个都适用于我

最后,singleton在整个项目中共享数据解决了这个问题


谢谢@David Evans

它在setEventViewController.m中显示的值是否正确?你不能这样做。因为变量的值不能在另一个类中持久化。@Alex G:请检查我的答案,并告诉我是否还能提供帮助。它在setEventViewController.m中显示的值正确吗?你不能这样做。因为变量的值不能在另一个类中持久化。@Alex G:请检查我的答案,并告诉我是否还能提供帮助。但不设置eventViewController*eventViewController=[[setEventViewController alloc]init];给我调用该类中任何变量的权利?谢谢你的回复!正是我需要的。非常感谢你!但是不设置eventViewController*eventViewController=[[setEventViewController alloc]init];给我调用该类中任何变量的权利?谢谢你的回复!正是我需要的。非常感谢你!你能举个例子吗?对不起,我是新手。并且不设置eventViewController*eventViewController=[[setEventViewController alloc]init];给我调用该类中任何变量的权利?谢谢你的回复!你能举个例子吗?对不起,我是新手。并且不设置eventViewController*eventViewController=[[setEventViewController alloc]init];给我调用该类中任何变量的权利?谢谢你的回复!