1

所以请原谅我,因为我对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

4

3 回答 3

2

试试这样...

对于 (+) 实例。

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

--步骤 1:从头文件中删除以下行

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

--第二步:

  • 全局添加UIButton *myTodayButton你的类文件..
  • 这意味着之前声明@implementation

例如:在.m 文件中

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

@implementation Controller

例如

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

于 2014-05-05T11:20:04.077 回答
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 (nonatomic, strong) 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。

    • (void)viewDidLoad { [超级 viewDidLoad];

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

[编辑]

如果你想沿着 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];
    }
}
于 2012-11-04T23:05:34.753 回答
0

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

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

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

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

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

于 2012-11-04T23:08:47.160 回答