0

也许是一种复杂的措辞方式。

应该发生的过程:

  1. FirstViewController 加载
  2. 您单击一个按钮,该按钮显示一个新视图,其中partial curl
  3. 你选择一个 UITableCell
  4. FirstViewController您在单击的任何单元格中设置一个属性
  5. 在回调方法中FirstViewController您访问属性以确定下一阶段的执行。

但是,当设置属性并尝试检索它时,它会以NULL. 这是我尝试设置它的方式:

FirstViewController.h

@interface FirstViewController : UIViewController
{
    NSString *navOption;
}
@property(nonatomic, retain) NSString *navOption;

FirstViewController.m( 打回来 ):

@synthesize navOption;

-(void)callBackForNav{
    NSLog(@"Inside callback: %@", navOption);
}

里面SecondViewController

FirstViewController *dw = [[FirstViewController alloc] 
    initWithNibName:nil bundle:nil];
dw.navOption = @"Filter Results";

我希望在回调navOption中等于过滤结果,但是它输出为NULL. 有什么想法我哪里出错了吗?

4

3 回答 3

3

如果我理解这一权利,那么你已经FirstViewController提出了,那么SecondViewController最重要的是。我navOption在代码中分配的问题SecondViewController是创建了一个 NEW FirstViewController,而不是引用旧的。因此,当您弹出堆栈并返回原始堆栈时,FirstViewController并未在其上设置数据,因为它是一个不同的实例。

现在我看到您正在尝试对类属性做一些事情,但我不确定这是否是正确的方法,您应该专注于获取对原始视图控制器的引用并在那里设置属性。

如果你真的想要一个类“属性”,你将不得不做这样的事情。

// MyClass.h
@interface MyClass {
}

+(NSObject*) theObject;

// MyClass.m
+(NSObject*) theObject
{
  static NSObject* staticObject = nil;

  if (staticObject == nil)
  {
    // create object
  }

  return staticObject;
}
于 2013-07-19T13:09:49.320 回答
0

将@synthesize 更改为

@synthesize navOption = navOption;

默认情况下,@synthensize 创建一个带有下划线前缀的实例变量。所以该navOption属性没有使用navOption实例变量。相反,它使用了一个名为_navOption.

您真正应该做的是删除实例变量和 @synthesize 并始终使用该属性。

FirstViewController.h:

@interface FirstViewController : UIViewController

@property(nonatomic, retain) NSString *navOption;

FirstViewController.m(回调):

-(void)callBackForNav{
    NSLog(@"Inside callback: %@", self.navOption);
}
于 2013-07-19T13:04:33.453 回答
0

使用此代码:

@interface FirstViewController : UIViewController
{
    NSString *navOption;
}
@property(nonatomic, retain) NSString *navOption;

您正在声明一个实例变量“navOption”和一个属性“navOption”。它们是两个完全独立的变量。

这行代码:

dw.navOption = @"Filter Results";

设置 navOption 属性的值。设置实例变量的语法是dw->navOption = @"Filter Results".

这行代码:

NSLog(@"Inside callback: %@", navOption);

正在读取您从未设置过的实例变量。读取属性的代码self.navOption不仅仅是navOption.

解决方案是不使用实例变量,因为除非在您需要极高性能的情况下(在这种情况下,您应该使用 C 而不是 Objective-C),否则不建议使用它们。基本上,实例变量是现代编程中很少使用的语言特性,但它仍然存在并且过去经常使用。


更改您的 NSLog 以打印self.navOption和删除这两行代码:

NSString *navOption; // in the .h file
@synthesize navOption; // in the .m file.
于 2013-07-19T13:10:20.870 回答