1

私はstackoverflowとiosプログラミング全般に非常に慣れていないので、ご容赦ください。

dateStringForInput現在のテキストを別のクラスから渡した日付文字列 ( ) に置き換えて、ボタンのテキストを変更しようとしています。ボタンが呼び出され、クラスのファイルでmyTodayButton宣言されます... ;.hinputMilesViewController@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: 自己オブジェクトにのみアクセスできます。

--ステップ 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: インスタンス メソッドにのみアクセスできます

于 2014-05-05T11:20:04.077 に答える
0

クラス メソッドはインスタンス変数にアクセスできないため、表示されているエラーが発生しています。

メソッドをインスタンス メソッドに変更する必要があります。

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

次に、メソッドを含むクラスのインスタンスへの参照を、メソッドを呼び出すクラスに渡すか取得する必要があります。

それが理にかなっていることを願っています...明確化が必要な場合はコメントを追加してください!

于 2012-11-04T23:08:47.160 に答える
0

メソッドをクラス メソッドの代わりにインスタンス メソッドに変更する (「+」ではなく「-」) クラスのインスタンスを作成し、次のように単純に呼び出します。

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

また、IBOutlets の弱いプロパティを持つことをお勧めします。

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

[編集]

セグエに関する2番目の問題について。まず、単に UIDatePicker を表示するために別のビュー コントローラーが本当に必要ですか? 私は通常、actionSheet を使用して同じ UIViewController にそれらを表示します。適切に処理するには少し手間がかかりますが、この問題は解決します。よろしければコードを投稿できますか?

とにかく、現在の設定を維持したい場合は、次のようにします。

  1. ボタンを含む ViewController で、.h ファイルに新しい public NSString プロパティを作成します。

    @property (非アトミック、強力) NSString *dateString;

  2. 日付ピッカーを含むビュー コントローラーで、ユーザーが日付を選択した後、perpareForSegue メソッドをオーバーライドします。ここで、目的のView Controller(上記のポイント1で作成されたボタンと新しい文字列プロパティを持つもの)を取得し、dateStringを設定します。

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

    }

  3. ボタンを含む ViewController で、viewDidLoad のボタンのタイトルを dateString に設定します。

    • (void)viewDidLoad { [super 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 に答える