0

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

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

我已经从 setEventViewController 中的 viewDidDisappear 进行了测试(NSLog 变量),以查看当视图消失时它是否为空,但它可以正常工作。

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

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) retrieveTheEvent
 {
  setEventViewController *eventViewController= [[setEventViewController alloc] init];
  NSString *testString= eventViewController.theVariable;

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

5 回答 5

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   }

于 2012-07-23T06:04:37.123 回答
1

在 Armaan 的列表中添加另一个解决方案。

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

[self.navigationController popViewControllerAnimated:YES];
于 2012-07-23T06:11:48.057 回答
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 代表;

- (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

设置时间视图控制器.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);
}
于 2012-07-23T07:13:31.447 回答
1

看看单身人士,

做这样的事情时,他们可以成为你最好的朋友。

单身人士链接在这里

于 2012-07-25T15:29:35.387 回答
0

我尝试了所有不同的建议,将 NSString 从一个视图控制器传递到另一个视图控制器,包括客户初始化方法,并将属性更改为强、保留,它们都不适合我。

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

谢谢@大卫埃文斯

于 2020-06-08T06:45:24.663 回答