我想使用iPhone的弹出视图。
我发现第三方库和作者说它的一些方法是使用私有方法。(这会在提交到app store时引起问题)
但我没有看到他的代码中使用私有方法的位置
你能发现它们吗?
[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];
}
答案 0 :(得分:1)
view不是UIBarButtonItem的公共属性。参考申请正在使用它。
要验证任何此类功能,最好使用点运算符或使用它的getter调用其属性(这是相同的事情)。
检查此代码,表明它是私有的:
UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
它正在使用performSelector访问视图,并且XCode不够智能,无法提供任何警告,同时以这些方式使用私有属性。
答案 1 :(得分:0)
根据我的经验,当您上传图片时,Apple会针对您的二进制文件运行一些自动检查。那么为什么不尝试上传,看看他们是否抱怨?我在一个包含的库中使用了一个方法在我们自己的类中得到了一点,这个方法与Apple类中的一些私有方法的名称相同,而且我的应用程序没有通过门来实现(我刚刚重命名了这个方法)我有源。)
答案 2 :(得分:0)
您不应该访问view
的{{1}}属性。这就是私人电话的地方:
UIBarButtonItem
请参阅the official doc for UIBarButtonItem
,它没有公开if(![barButtonItem respondsToSelector:@selector(view)]) {
// error
return;
}
UIView *targetView = (UIView *)[barButtonItem performSelector:@selector(view)];
属性。
虽然,它不是真正的私人通话,因为view
方法是完全合法的,并且不会触发某些警报(例如,如果您使用的方法名称仅用于私人通话),那么Apple不应该注意它。但我只说不应该,而不会。