这是一个非常简单的问题,对于我的生活,我无法弄清楚为什么这不起作用。所以,如果这是一个愚蠢的问题,我很抱歉,但请光临我。
我有一个名为“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
}
答案 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)
答案 4 :(得分:0)
我尝试了所有不同的建议,将NSString从一个viewController传递到另一个,包括客户初始化方法,并将属性更改为strong,remaining,它们都不适合我。
最后,在项目中共享数据的单例解决了该问题。 http://www.galloway.me.uk/tutorials/singleton-classes/
感谢@David Evans