从 UITableView/UITableViewCell 访问私人 class

Access private class from UITableView/UITableViewCell

出于某些 RTL 目的,我需要调整某些子视图的框架,例如 UITableViewCell 中的“_UITableViewCellSeparatorView”和 UITableView 中的“UITableViewIndex”。

这是我的代码:

for (UIView *view in [self subviews]) {
            // separator view
            if ([view isKindOfClass:NSClassFromString(@"_UITableViewCellSeparatorView")]) {
                CGRect frame = view.frame;
                frame.origin.x = 0;
                view.frame = frame;
            }
        }

if ([self.superview isKindOfClass:[UITableView class]]) {
            UITableView* tableView = (UITableView*)self.superview;
            UIView* indexView = [[tableView subviews] lastObject];

            if ([indexView isKindOfClass:NSClassFromString(@"UITableViewIndex")]) {

                indexViewWidth = indexView.frame.size.width;
            }                
        }

不知苹果审核组是否会通过这些改动? 我只知道我们不能使用或调用私有API。 谢谢!

修改

首先,Apple 可能不接受您的应用程序(如您在指南中所见,他们不接受私人 API 访问)或他们接受它并在更新或新版本中拒绝它。 如果他们在未来接受了您的应用程序(我已经发布了一些具有类似代码的应用程序)OS 是否发布此标识符 public 类(您使用自省发现)可能会被 Apple 更改并且它可能会使您的应用程序无法正常工作

之前为了解决UIAlertViewUINavigationBar的一些问题我做了几次,没关系。甚至像 method swizzling 这样的事情也是合法的。

未授权使用私有 API。

来自 Apple 评论指南:

2.5 Apps that use non-public APIs will be rejected

所以它可能会通过一次,但它不是保证,我建议你不要使用私人 APIs。

我已经提交了一些访问几个私有方法的应用程序,并且在审核过程中没有问题,但是当Apple推出iOS 8时,大多数方法都发生了变化,我不得不摆脱它们。所以,可以,但不推荐

随着 iOS 9 的发布和完整的 RTL 支持,不再需要像这样的解决方法。