初始化后是否可以访问类属性,并且可以在回调方法中使用

时间:2013-07-19 12:57:48

标签: ios objective-c properties

也许是一种复杂的措辞。

应该发生什么的过程:

  1. FirstViewController加载
  2. 您点击了一个显示partial curl
  3. 新视图的按钮
  4. 您选择了UITableCell
  5. 您在FirstViewController中设置了一个属性,无论单击的是哪个单元格
  6. FirstViewController的回调方法中,您可以访问该属性以确定下一个执行阶段。
  7. 但是,在设置属性并尝试检索它时,它将返回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。我出错的任何想法?

3 个答案:

答案 0 :(得分:3)

如果我理解了这一点,那么您就会FirstViewController出现SecondViewController。我在代码中分配navOption时看到的问题是SecondViewController创建了一个新的FirstViewController,而不是引用旧的FirstViewController。因此,当您弹出堆栈并返回原始// MyClass.h @interface MyClass { } +(NSObject*) theObject; // MyClass.m +(NSObject*) theObject { static NSObject* staticObject = nil; if (staticObject == nil) { // create object } return staticObject; } 时,数据未设置在其上,因为它的实例不同。

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

如果你真的想要一个班级"属性"你必须做这样的事情。

{{1}}

答案 1 :(得分: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);
}

答案 2 :(得分: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.