2

クラスの内外から呼び出す必要がある関数を持つクラスがあります。次のコードは正常に動作しますがlowerKeyboard、 - と + を使用して 2 つのメソッドではなく 1 つのメソッドのみを使用する方法はあるのでしょうか? + メソッドだけを保持するunrecognized selector sent to instanceと、クラス内からメソッドを呼び出そうとするとエラーが発生します

クラス内から:

-(void)someOtherMethod
{
    UIBarButtonItem *infoButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone  target:self action:@selector(lowerKeyboard)];
}

クラスの外から:

[myClass lowerKeyboard];

私のクラス:

-(void)lowerKeyboard
{
    //do something

}

+(void)lowerKeyboard
{
        //do the exact same thing
}
4

2 に答える 2

3

次のものがあるとします。

- (void)doFoo
{
  NSLog(@"Foo");
}

+ (void)doFoo
{
  NSLog(@"Foo");
}

これをリファクタリングして、次のように両方の実装を行うことができます。

- (void)doFoo
{
  [[self class] doFoo];
}

+ (void)doFoo
{
  NSLog(@"Do Foo!");
}

ただし、このように名前が似ているメソッドが 2 つあると問題が発生することは指摘しておく価値があります。混乱を避けるために、2 つのインターフェースのうちの 1 つを削除した方がはるかに良いでしょう (特に、必要な実装のコピーは 1 つだけなので!)。

悪いアドバイスが続きます - ランタイムをいじる方法を本当に知っていない限り、実際にはこれを行わないでください (私は知りません)。

技術的には、ランタイムを次のように編集することで、クラスの実装とインスタンスの実装を複製できます。

// Set this to the desired class:
Class theClass = nil;
IMP classImplementation = class_getImplementation(class_getClassMethod(theClass, @selector(doFoo)));
class_replaceMethod(theClass, @selector(doFoo), classImplementation, NULL)

これにより、+[theClass doFoo] を呼び出すと、-[theClass doFoo] を呼び出すのとまったく同じ実装が呼び出されるようになります。クラスの実装スタックから元のインスタンスの実装を完全に削除します (取り扱いには十分注意してください)。ただし、そうするのに本当に正当なケースは思いつかないので、これを少し塩で扱ってください!

于 2013-10-01T14:15:34.030 に答える
0
-(void)lowerKeyboard
{
    //this can be called on class instance

    //UIBarButtonItem *infoButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone  target:self action:@selector(lowerKeyboard)];
    //[infoButtonItem lowerKeyboard];
}

+(void)lowerKeyboard
{
    //this can be used as class static method
    //you cannot use any class properties here or "self"

    //[UIBarButtonItem lowerKeyboard];
}
于 2013-10-01T14:08:25.633 に答える