2017-05-25 5 views
2

私は、タグを使って1の5、1の16、または1の10のUIButtonsを識別する初期のプロジェクトを改訂しています。私はthis answerの私の理解に基づいてカスタマイズされたプロパティでタグを置き換えたいです。これがObjective Cでカスタマイズされた文字列プロパティを使用する正しい方法なら、なぜ正しい数値を抽出できないのですか?

と呼ばれるプロパティは、文字列の後に整数が続くものです。これは別の名前のタグでもよいかもしれませんが、単純な整数タグではできないようにメッセージソースを一意に識別し、自分のコードからマジックナンバーを消去し、うまくいけばドキュメントを改善します。

プロパティ

は、カテゴリを使用して作成され

のUIView + CustomProperties.m

#import "UIView+CustomProperties.h" 

    @implementation UIView (MyInfo) 

    -(void)setMyInfo:(id)info 
    { 
     objc_setAssociatedObject(self, "_myInfo", info, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 

    -(id)myInfo 
    { 
     return objc_getAssociatedObject(self, "_myInfo") ; 
    } 

    @end 

そしてmyInfo作品、私はobjc/runtime.h

のUIView + CUSTOMPROPERTIESをインポートします。

#import <objc/runtime.h> 

    @interface UIView (MyInfo) 
    @property (nonatomic, strong) id myInfo; 

    @end 

私は、ボタンのいくつかのセットを作成するUIViewに(下記)メソッドからカテゴリを呼び出します。

// define type and number of 5, 16 or 10 buttons 

    switch (buttonCount) { 
     case 5: 
      roundButton.myInfo = [NSString stringWithFormat:@"transpose index %i", i ]; 
      break; 
     case 16: 
      roundButton.myInfo = [NSString stringWithFormat:@"player index %i", i ]; 
      break; 
     case 10: 
      roundButton.myInfo = [NSString stringWithFormat:@"note index %i", i ]; 
      break; 
     default: 
      roundButton.myInfo = @“orphan button“; 
     break; 
    } 

私はthis methodを使用してmyInfoからすべての非数値文字を剥ぎ取るしようとしたメッセージの送信元を特定すること。しかし、問題は、私は私がビルドして実行し、押しボタン1ときに数字以外の文字

- (void)fromButtons:(UIButton*)button       { 
    NSLog(@"Button %ld tapped", (long int)[button tag]); 
    NSLog(@"first, %@", button.myInfo); 

    NSString *newString = [[button.myInfo componentsSeparatedByCharactersInSet: 
         [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
         componentsJoinedByString:@""]; 

    NSLog(@"then, %@", newString); 
    NSLog(@"and %li", (long int)newString); 

を削除しようとして、私の選択方法forButtonsに表示されます農産物上記NSLog文次のログ

2017-05-25 18:27:33.147 SatGam3[930:607301] Button 1 tapped 
    2017-05-25 18:27:33.147 SatGam3[930:607301] first, transpose index 1 
    2017-05-25 18:27:33.148 SatGam3[930:607301] then, 1 
    2017-05-25 18:27:33.148 SatGam3[930:607301] and 2070247168 

元のタグのlong intの値は正しいです。つまり、カスタマイズされたプロパティから復元されたlong intは2070247168です。

Q.1最初に、このアプローチは正しい?

Q.2その場合、誰かがなぜ9桁の数値をmyInfoから抽出するのか説明してください。

答えて

3

まず、あなたの問題とは関係のない問題:"_myInfo"をキーとして使用すると、やや危険です。実際には、それを取り除くつもりですが、約束されていないコンパイラの最適化に依存しています。コンパイラ(とおそらくリンカ)が、同じ定数文字列のすべてのコピーがバイナリ内の同じメモリ位置を参照するようにすることを賭けている。それは事実ですが、それは言語の一部ではありません。 Use a selector instead.

しかし、それはあなたの問題ではありません。あなたの問題は、このです:

NSLog(@"and %li", (long int)newString); 

newStringは(当然)NSString*です。したがって、この文字列のアドレスを指しています。これを番号に変換したい場合は、-intValueに電話してください。

つまり、私はこのデータを文字列としてエンコードしません。データオブジェクトとしてエンコード:あなたは-descriptionメソッドを追加し、読むためにこれを簡単にしたい場合は

@interface ButtonInfo 
@property (copy) NSString *name; 
@property (assign) NSInteger index; 
@end 

(それらのセットが固定されている場合やnameは列挙することができます)。タイプシステムを使用します。それはあなたを助けるためのものです。複雑な型を文字列にエンコードしようとしないでください。コードの行の下に

+0

ロッド、これは受け入れられる回答でなければなりません。提供されたすべてのソリューションは、「NSString」の使用に関連する問題に対処しましたが、この回答は私が何を疑っているかを確認します。情報を別の方法でエンコードするほうがよいかもしれないことを示しています。 '-description'がなくても、' * name'と 'index'のための別のボタンプロパティで既に明確になっています。ありがとう。 – Greg

1

用途:

NSLog(@"and %li", [newString intValue]); 

あなたのアプローチが正しいです。

関連する問題