“在类方法中访问实例变量'xxx'为什么?

时间:2012-11-04 22:59:02

标签: iphone xcode methods instance instance-variables

所以请原谅我,因为我对stackoverflow和ios编程很新。

我正在尝试更改我所拥有的按钮的文本,将当前文本替换为我从另一个类传入的日期字符串(dateStringForInput)。该按钮名为myTodayButton,在我的.h文件中为我的班级inputMilesViewController声明...    @property (strong, nonatomic) IBOutlet UIButton *myTodayButton;

以下是我的.m代码。

+(void) changeButtonText:(NSString*) dateStringForInput{

     NSLog(@"we got to changebuttontext");
     [_myTodayButton setTitle:dateStringForInput forState:UIControlStateNormal];
}

我收到以下错误“实例变量”_myTodayButton“在类方法中访问。

我知道这是用类方法而不是实例方法编写的,但是我无法弄清楚如何让这种改变发生。提示此changeButtonText调用的按钮位于创建dateStringForInput的另一个类中。

3 个答案:

答案 0 :(得分:2)

试试这样......

对于(+)实例。

+ (void) changeButtonText:只能访问自我对象。

- 第1步:标题文件中删除以下行

@property (strong, nonatomic) IBOutlet UIButton *myTodayButton;

- 第2步:

  • 在全局范围内添加UIButton *myTodayButton ..
  • 这意味着在@implementation
  • 之前声明

例如:在 .m文件

#import "Controller.h"
UIButton *myTodayButton // Add like this before @implementation

@implementation Controller

对于( - )实例

- (void) changeButtonText:只能访问实例方法

答案 1 :(得分:0)

将方法更改为实例方法而不是类方法(“ - ”而不是“+”)创建类的实例,然后简单地调用它:

MyClass *classInstance = [[MyClass alloc] init];
[classInstance changeButtonText:@"stringText"];

同时建议IBOutlets具有弱属性。​​

@property (nonatomic, weak) IBOutlet UIButton *myButton;

[编辑]

关于segues的第二个问题。首先,你真的需要一个不同的视图控制器来简单地显示UIDatePicker吗?我通常使用actionSheet在同一个UIViewController中显示它们,它可以做一些正确的工作,但解决了这个问题。如果你愿意,我可以发布代码吗?

无论如何,如果您想保留当前的设置,我会执行以下操作:

  1. 在包含该按钮的ViewController中,在.h文件中创建一个新的公共NSString属性。

    @property(非原子,强)NSString * dateString;

  2. 在包含日期选择器的View Controller中,在用户选择日期后覆盖perpareForSegue方法。在这里获取目标视图控制器(具有按钮和上面第一点中创建的新字符串属性的控制器)并设置dateString。

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
    MyViewController *todayViewController = (MyViewController*)[segue destinationViewController];
    [todayViewController setDateString:@"valueYouRequire"];
    

    }

  3. 在带有按钮的ViewController中,将viewDidLoad中的按钮标题设置为dateString。

    • (无效)viewDidLoad中 { [super viewDidLoad];

    if(self.dateString)[self.myTodayButton setTitle:self.dateString forState:UIControlStateNormal]; }

  4. [编辑]

    如果您想沿着actionSheet路线走下去,请使用按钮将此方法添加到ViewController,并使用框架尺寸来满足您的需求。下面的方法创建一个日期选择器,将其添加到actionSheet并显示actionSheet。

    - (IBAction) datePressed:(id)sender {
    
    if (!_actionSheet) {
    
    _actionSheetFrame = CGRectMake(0, self.view.frame.size.height - 373, 320, 403);
    _actionSheetBtnFrameOk = CGRectMake(20, 330, 280, 50);
    _actionSheetBtnFreameCancel = CGRectMake(20, 275, 280, 50);
    _pickerFrame = CGRectMake(0, 50, 320, 216);
    
    
        _actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Date" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"OK", nil];
        _datePicker = [[UIDatePicker alloc] init];
        [_datePicker setDatePickerMode:UIDatePickerModeDate];
    
        [_actionSheet addSubview:_datePicker];
    }
    
    [_datePicker setMaximumDate:[NSDate date]];
    
    [_actionSheet showInView:self.view.superview];
    [[[_actionSheet subviews] objectAtIndex:kActionBtnIndexOk] setFrame:_actionSheetBtnFrameOk];
    [[[_actionSheet subviews] objectAtIndex:kActionBtnIndexCancel] setFrame:_actionSheetBtnFreameCancel];
    
    [_actionSheet setFrame:_actionSheetFrame];
    [_datePicker setFrame:_pickerFrame];
    

    }

    一旦用户选择了所需的日期,您还必须实现UIActionSheetDelegate方法来设置按钮的文本。

    #pragma mark - UIActionSheet Delegate Methods
    
    - (void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    
        if (buttonIndex == 0) {
            [self.myTodayButton setTitle:self.dateStringFromSelectedDate forState:UIControlStateNormal];
        }
    }
    

答案 2 :(得分:0)

类方法无法访问实例变量,这就是您收到错误的原因。

您需要将方法更改为实例方法:

- (void)changeButtonText:(NSString *)dateStringForInput;

然后,您需要向调用该方法的类传递或获取对包含该方法的类的实例的引用。

我希望这是有道理的......如果您需要澄清,请添加评论!