0

iPhoneのポップオーバービューを使いたいです。サードパーティのライブラリを見つけましたが、そのメソッドの一部がプライベート メソッドを利用していると著者は言っています (アプリ ストアに送信するときに問題が発生し
ます)。
あなたはそれらを見つけることができますか?

[barButtonItem performSelector:@selector(view)] はプライベート メソッドを呼び出していると見なされますか?

https://github.com/sonsongithub/PopupView/blob/master/SNPopupView%2BUsingPrivateMethod.m

- (void)showFromBarButtonItem:(UIBarButtonItem*)barButtonItem inView:(UIView*)inView animated:(BOOL)animated {

        if(![barButtonItem respondsToSelector:@selector(view)]) {
            // error
            return;
        }

    UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
    UIView *targetSuperview = [targetView superview];

    BOOL isOnNavigationBar = YES;

    if ([targetSuperview isKindOfClass:[UINavigationBar class]]) {
        isOnNavigationBar = YES;
    }
    else if ([targetSuperview isKindOfClass:[UIToolbar class]]) {
        isOnNavigationBar = NO;
    }
    else {
        // error
        return;
    }

    CGRect rect = [targetSuperview convertRect:targetView.frame toView:inView];

    CGPoint p;
    p.x = rect.origin.x + (int)rect.size.width/2;

    if (isOnNavigationBar)
        p.y = rect.origin.y + rect.size.height + BAR_BUTTON_ITEM_UPPER_MARGIN;
    else
        p.y = rect.origin.y - BAR_BUTTON_ITEM_BOTTOM_MARGIN;

    [self showAtPoint:p inView:inView animated:animated];
}
4

3 に答える 3

1

ビューはUIBarButtonItemのパブリックプロパティではありません。そして、リファレンスアプリケーションがそれを使用しています。

このような機能を検証するには、ドット演算子を使用するか、ゲッターを使用してそのプロパティを呼び出すことが望ましいです(これは同じことです)。

このコードを確認してください。これは、プライベートであることを示しています。

UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];

これはperformSelectorを使用してビューにアクセスしており、XCodeは、これらの方法でプライベートプロパティを使用している間、警告を出すほど賢くはありません。

于 2012-08-24T15:05:46.407 に答える
0

私の経験から、イメージをアップロードするとき、Apple はバイナリに対していくつかの自動チェックを実行します。それでは、アップロードを試して、彼らが文句を言うかどうかを確認してみませんか? Appleクラスのプライベートメソッドと同じ名前の独自のクラスのメソッドを使用して、含まれているライブラリに一度噛まれました。そのため、アプリはゲートを通過しませんでした(ソースがありました。)

于 2012-08-24T14:53:27.897 に答える
0

viewのプロパティにアクセスすることは想定されていませんUIBarButtonItem。それがプライベートコールの場所です:

if(![barButtonItem respondsToSelector:@selector(view)]) {
    // error
    return;
}

UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];

の公式ドキュメントをUIBarButtonItem参照してください。パブリックviewプロパティはありません。

viewただし、メソッドは完全に合法であり、アラートをトリガーしないため(プライベート呼び出しでのみ使用されるメソッド名を使用した場合など)、実際にはプライベート呼び出しではないため、Apple はそれに気付かないはずです。しかし、私はすべきではないとしか言​​いませんでした。

于 2012-08-24T14:59:02.453 に答える