MCBrowserViewController横屏失效、无法子类化及启动报错的问题咨询
解决MCBrowserViewController横屏适配与NIB加载报错问题
我之前在做Multiplayer Connectivity相关功能时,也踩过MCBrowserViewController横屏适配和NIB加载的坑,结合你的情况,给你几个可行的解决方案:
1. 先解决NIB加载失败的报错
你遇到的NSInternalInconsistencyException: Could not load NIB in bundle错误,大概率是因为没有使用MCBrowserViewController的指定初始化方法。这个类不能直接用init()或者initWithNibName:bundle:初始化,必须使用专门的构造方法:
Objective-C代码:
// 先创建MCSession实例 MCPeerID *peerID = [[MCPeerID alloc] initWithDisplayName:[[UIDevice currentDevice] name]]; MCSession *session = [[MCSession alloc] initWithPeer:peerID]; // 用指定方法初始化MCBrowserViewController MCBrowserViewController *browserVC = [[MCBrowserViewController alloc] initWithServiceType:@"你的服务标识" session:session];
Swift代码:
// 先创建MCSession实例 let peerID = MCPeerID(displayName: UIDevice.current.name) let session = MCSession(peer: peerID) // 用指定方法初始化MCBrowserViewController let browserVC = MCBrowserViewController(serviceType: "你的服务标识", session: session)
注意:
serviceType必须是短字符串(最多15个字符,只能包含字母、数字和连字符),要和你在服务端设置的一致。
2. 强制MCBrowserViewController保持横屏(绕开子类化限制)
Apple明确说明MCBrowserViewController不支持子类化,所以重写supportedInterfaceOrientations的路子走不通。我们可以用容器ViewController包裹的方式,让容器来控制屏幕方向:
Objective-C实现容器VC:
@interface OrientationContainerVC : UIViewController @property (nonatomic, strong) MCBrowserViewController *browserVC; @end @implementation OrientationContainerVC - (instancetype)initWithBrowserVC:(MCBrowserViewController *)browserVC { self = [super init]; if (self) { _browserVC = browserVC; // 将MCBrowserViewController添加为子VC [self addChildViewController:browserVC]; browserVC.view.frame = self.view.bounds; [self.view addSubview:browserVC.view]; [browserVC didMoveToParentViewController:self]; } return self; } // 强制只支持右侧横屏 - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscapeRight; } @end
Swift实现容器VC:
class OrientationContainerVC: UIViewController { private let browserVC: MCBrowserViewController init(browserVC: MCBrowserViewController) { self.browserVC = browserVC super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() // 将MCBrowserViewController添加为子VC addChild(browserVC) browserVC.view.frame = view.bounds view.addSubview(browserVC.view) browserVC.didMove(toParent: self) } // 强制只支持右侧横屏 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .landscapeRight } }
3. 最后正确present容器VC
不要直接present MCBrowserViewController,而是present我们的容器VC,同时设置全屏模态样式:
Objective-C代码:
OrientationContainerVC *containerVC = [[OrientationContainerVC alloc] initWithBrowserVC:browserVC]; containerVC.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:containerVC animated:YES completion:nil];
Swift代码:
let containerVC = OrientationContainerVC(browserVC: browserVC) containerVC.modalPresentationStyle = .fullScreen present(containerVC, animated: true)
这样操作后,MCBrowserViewController就会严格遵循你的横屏设置,同时也不会再出现NIB加载失败的问题了。
内容的提问来源于stack exchange,提问作者DenverCoder9
相关产品推荐
相关产品推荐

